簡體   English   中英

獲取ImageView圖片原始大小

[英]Get ImageView Image Original Size

我有一個帶有ImageViewTableViewCell ,並且正在像這樣設置圖像:

[self.contentImageView setImageWithURL:thumbnail_url];

contentMode設置為UIViewContentModeScaleAspectFill ,並且子視圖被裁剪。 這對縱向或橫向圖像效果最佳,但UIViewContentModeScaleToFill實際上對橫向圖像效果更好,橫向圖像要豐富得多。

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

剛開始,我嘗試從URL設置ImageView.image屬性后立即對其進行檢查/記錄,但顯示為nil。 不知道為什么要...?

接下來,我決定將NSURL放入NSData對象,然后根據該數據創建UIImage ,並使用該iVar設置ImageView的image屬性,如下所示:

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

這-尤其是NSData調用-大大降低了TableViewCell's加載速度,因此我想避免這樣做。

因此,我想知道在contentMode發生縮放之前是否有任何途徑可以進入ImageView未裁剪的源圖像屬性?

這里的問題是您對第一種方法的工作方式有誤解。 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;

無論采用哪種方式,一旦下載圖像(如果成功),回調塊都將允許您訪問該圖像。

您還可以使用dataWithContentsOfURL:方法通過使用GCD來手動完成類似的工作:

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];
                                  });
               });

這是在聯網中用於在更新主隊列上的視圖之前對后台隊列執行網絡請求和處理的基本模式。 請記住,這段特定的代碼非常簡單,需要更多的工作才能像我上面提到的庫一樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM