我一直在试图解决一个问题
背景
假设我想要计算出一个完美适应于Storyboard中使用约束进行布局的UIImageView的UIImage。
这个imageView的内容不应该填充或按比例缩放,而是完美地适应框架。因此,在我的viewController中有一个方法。
- (UIImage *)calculatedImageForRect:(CGRect)imageRect
问题
我希望在视图变得可见时,确保imageView已经包含了正确的图像,因此在简单的推送转换期间也是如此。 此外,我不想多次生成UIImage,因为它的成本相对较高。
这在像iPhone6 Plus这样的设备上特别有趣,因为它们具有不同的屏幕分辨率。
显然,在viewDidLoad
中,框架没有设置正确。在此时刻,框架被设置为Storyboard预览中的设置 - 例如为表示iPhone5分辨率而设置。对于viewWillAppear
也是同样的情况。在这里,框架将是(10,10,300,100)。让我们称其为wrong-frame
在viewDidAppear
时,框架是正确的(10,10,394,100)= correct-frame <-- iPhone6Plus的宽度为414点,而不是320点。尽管如此,在这里为时已晚,因为视图已经可见,并且设置图像将导致闪烁(空白图像>新生成的图像)。
我知道使用宽度的正确时间是viewDidLayoutSubviews
,它首先至少一次以wrong-frame被调用,然后在某一时刻以correct-frame被调用。但是,正如我所说,我不想多次生成图像,这里就是两难:
我怎样才能在它可见之前确定right-frame?
当然,我可以通过使用UIImageView的尾部和首部约束来计算正确的框架,从[UIScreen mainScreen]
分辨率中工作,但这感觉很糟糕。