最近我们的应用程序需要替换图像提取逻辑,这样客户端就应该请求一个大小合适的图像(图像是从服务器动态构建的)。
图片网址具有以下格式:
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
之前运行图像提取时,目标图像容器&#39 ; s大小始终为零。
毕竟,我们需要弄清楚布局完成的时间(使用观察者对图像容器),或者对所有图像容器都有静态大小。
对此最好的解决方案是什么?
答案 0 :(得分:0)
我相信,也许你不需要“精确”的图像尺寸,因为图像可以放大或缩小。在我看来,你需要足够接近图像的大小。因为(我猜)图像大小由屏幕大小决定(由设备决定),您可以为图像准备功能,为正确的设备返回正确的大小。
你可以知道iPhone 4,iPhone 5,....的尺寸,然后加载正确尺寸的图像(在layoutSubviews之后将加载哪个容器)
第二个想法(正如xaphod提到的)在下载应用程序时加载所有大小,然后在layoutSubviews中加载正确的大小。但请注意,如果有很多大小的图像,那么对于永远不会放在应用程序中的图像来说,这可能是一个巨大的空间消耗。
答案 1 :(得分:0)
从指定大小的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()。缩放线根据您的设备为您提供图像大小。
let url = ImageService().buildImageString("ImageName", imageMode: .Zoom, size:CGSizeMake(self.view.frame.size.width, headerHeight), scale:UIScreen.mainScreen().scale)