2015-05-07 385 views
1

我有一個ImageView一個TableViewCell,和我設置的圖像,像這樣:獲得ImageView的原始圖象尺寸

[self.contentImageView setImageWithURL:thumbnail_url]; 

contentMode設置爲UIViewContentModeScaleAspectFill,和子視圖被裁剪。 這對於縱向或橫向的圖像效果最佳,但UIViewContentModeScaleToFill實際上對橫向圖像效果更佳,而這種效果更爲豐富。

因此,我想通過比較寬度和高度來檢測圖像的方向,並相應地更改contentMode

起初,我試圖檢查/登錄ImageView.image屬性,直接從url設置後,但它顯示爲零。 不確定爲什麼......?

接下來,我決定把該NSURLNSData對象,然後創建從數據UIImage,並與伊娃設置ImageView的形象財產,像這樣:

NSData *data = [NSData dataWithContentsOfURL:thumbnail_url]; 
UIImage *image = [UIImage imageWithData:data]; 
[self.contentImageView setImage:image]; 
// Get image.size etc. 

這 - 特別是NSData的呼叫 - 大大減緩了TableViewCell's的負載,所以我想避免它。

所以,我想知道是否有無論如何要走向ImageView未裁剪源圖像屬性中的比例發生了contentMode過嗎?

+1

你使用AFNetworking嗎?我問,因爲你調用函數「setImageWithURL」。 (無效)setImageWithURLRequest:(NSURLRequest *)urlRequest placeholderImage:(UIImage *)placeholderImage success:(void(^)(NSURLRequest * request,NSHTTPURLResponse * response,UIImage * image) )成功 失敗:(void(^)(NSURLRequest * request,NSHTTPURLResponse * response,NSError * error))failure;「並在「成功」塊中打印image.size? – jregnauld

+0

@jregnauld是的,這種方法是AFNetworking的一部分 - 對不起,剛注意到這個(不是我原來的代碼)...會試試這個方法... –

回答

2

這裏的問題是您對第一種方法如何工作的誤解。 setImageWithURL:是來自其中一個開源圖像加載庫的方法。可能是AFNetworkingSDWebImage

這些方法是異步的,並立即返回。他們將圖像下載到後臺隊列中,然後返回主隊列以使用該隊列設置視圖。在下載之前,您正嘗試訪問image。手冊NSData方法工作的原因是因爲它是同步的,主隊列在圖像下載時卡住。

我提到的兩個庫都有獨立的方法,在主隊列上有一個回調塊,允許您對響應進行操作。

對於AFNetworking您可以使用此方法:

- (void)setImageWithURLRequest:(NSURLRequest *)urlRequest 
       placeholderImage:(UIImage *)placeholderImage 
         success:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image))success 
         failure:(void (^)(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error))failure; 

對於SDWebImage您可以使用此方法:

- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; 

在這兩種,回調塊會讓你訪問圖像,一旦被下載(如果成功)。

您也可以通過使用GCD這樣做是這樣的工作中使用的dataWithContentsOfURL:方法手動:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() 
       { 
        NSData *data = [NSData dataWithContentsOfURL:thumbnail_url]; 
        UIImage *image = [UIImage imageWithData:data]; 
        dispatch_async(dispatch_get_main_queue(), ^() 
            { 
             [self.contentImageView setImage:image]; 
            }); 
       }); 

這是在聯網之前執行的背景隊列網絡請求並處理時使用的基本模式更新主隊列上的視圖。請記住,這段代碼非常簡單,需要更多的工作才能像上面提到的庫一樣工作。

+0

感謝您的回答...是的,我正在使用這兩個我的項目中的庫0並沒有意識到這個調用是最初的AFNetworking庫的一部分...將研究異步方法,並嘗試做我需要做的成功塊... –

+0

做到了這一點, 謝謝!應該看看超類 - 只是認爲它是基本的UIKit ...是的,經過反思,圖像的(a-)同步零是有意義的... –

相關問題