【问题标题】:iOS Load image from URL specifying sizeiOS从指定大小的URL加载图像
【发布时间】:2017-09-02 07:37:43
【问题描述】:

最近我们的应用需要在图片获取逻辑上进行替换,这样客户端应该请求一个与其大小相同的图片(图片是从服务器动态构建的)。

图片网址格式如下: http://image.server.url/path?width={{width}}&height={{height}}

大部分自定义视图都是按照以下模式构建的:

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        // do some initializations
    }
    return self;
}

- (void)setImageURL:(NSURL *)URL {
    // do image fetching
}

它被实例化为:

SomeView *view = [[SomeView alloc] init];
view.imageURL = [NSURL URLWithString:@"..."];
[self addSubview:view];

这不是问题(因为所有图像的大小都是静态的),但是当请求具有动态大小的图像时不可用,因为在调用 -layoutSubviews 之前运行图像提取,目标图像容器的大小始终为零。

毕竟,我们需要弄清楚布局完成的时间(对图像容器使用观察者),或者为所有图像容器设置静态大小。

什么是最好的解决方案?

【问题讨论】:

  • 最好的解决方案是异步加载网络资产,即。下载完成后,您可以使用“什么是真实的”来更新您的 UI。实际上,这意味着在加载网络资产时,您要么显示动画进度图形(“正在加载!等待!”),要么显示占位符资产(获得真实的低分辨率图形)

标签: ios objective-c image request size


【解决方案1】:

我相信,也许您不需要图像的“精确”尺寸,因为图像可以放大或缩小。在我看来,您需要足够接近图像的大小。因为(我猜)图像大小由屏幕大小(由设备决定)决定,你可以为图像准备函数,为正确的设备返回正确的大小。

您可以先了解 iPhone 4、iPhone 5、.... 的尺寸,然后加载正确尺寸的图像(在 layoutSubviews 之后将加载哪个容器)

第二个想法是(正如 xaphod 提到的),您在下载应用程序时加载所有尺寸,然后在 layoutSubviews 中加载正确的尺寸。但是请注意,如果有很多尺寸很大的图像,那么对于永远不会放置在应用程序中的图像来说,这可能是一个巨大的空间消耗。

【讨论】:

    【解决方案2】:

    从指定尺寸的 URL 加载图片,也根据 iPhone 设备尺寸。

    这里,我一直在使用的例子。不幸的是,它在 Swift 中,但不用担心它会给出如何使用 Objective-c 的基本概念。另外,主要是根据设备大小图片下载。

    创建类

    import UIKit
    
    public class ImageService: NSObject {
    
         public enum ImageMode:String {
              case Uniform = "Uniform"
              case Zoom = "Zoom"
              case Pad = "Pad"
    
         var description : String {
            get {
                return self.rawValue
            }
         }
      }
       public func buildImageString(imageName:String, imageMode:ImageMode, size:CGSize, scale:CGFloat)-> NSURL{
          return NSURL(string: MonsciergeCoreKit.repository().apiRoot + "/v1/Images?imagePath=\(imageName)&mode=\(imageMode.description)&width=\(Int(size.width * scale))&height=\(Int(size.height * scale))")!
       }
    
    }
    

    用法

    您可以根据您的使用情况更改值。 UIScreen.mainScreen().scale 行根据您的设备为您提供图像大小。

        let url = ImageService().buildImageString("ImageName", imageMode: .Zoom, size:CGSizeMake(self.view.frame.size.width, headerHeight), scale:UIScreen.mainScreen().scale)
    

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2016-09-21
      相关资源
      最近更新 更多