[英]UIimageView masks into a diamond
我不知道我的iOS应用程序中遇到了一个超级奇怪的错误。
我在iOS应用程序中为用户加载了UIImageView,然后将其四舍五入。
- (void)viewDidLoad {
[super viewDidLoad];
self.profileImage.file = [[self.profileObject objectForKey:@"UserID"] valueForKey:@"ProfilePhoto"];
[self.profileImage loadInBackground:^(UIImage *image, NSError *error) {
self.profileImage.image = image;
self.profileImage.layer.cornerRadius = self.profileImage.frame.size.width / 2;
self.profileImage.layer.masksToBounds = YES;
self.profileImage.contentMode = UIViewContentModeScaleAspectFill;
}];
}
这运行得很好,直到我关闭该视图并过一会儿再回到它。
- (void)dismissView {
[self dismissViewControllerAnimated:YES completion:nil];
self.profileImage.image = nil;
}
当我回到视图时,图像从先前已经四舍五入的位置开始四舍五入。 这意味着它随后变成了某种钻石。 看到这里: http : //cl.ly/image/3p1P0M0M1d2H
有什么想法为什么会这样?
解决方法
我发现如果将图像加载到viewDidLoad中并在viewDidAppear中将其取整,则效果很好。 但这似乎是“ hacky”,并且不能同时正确加载所有内容。
关于我应该尝试的任何想法?
问题在于您正在使用单一后台线程技术加载图像,并且第一次加载时,它大概必须从某个位置获取图像,第二次加载时,它大概具有缓存版本,因此它可以运行完成块立即。
为什么这很重要?
在viewDidLoad
“自动布局”下,图像视图的框架将为零,但您正在使用它进行圆角处理。
第一次运行时,加载图像的延迟足以使视图执行布局遍历,因此可以正确舍入。 在第二次运行中,它没有(因为图像已缓存),因此没有。
正如您已经发现的,解决方案是在布局发生时设置视点半径-在viewDidLayoutSubviews
或viewDidAppear
。 设置半径可以与加载图像完全分开,并且一点也不“笨拙”。
更好的解决方案是编写一个图像视图子类,该子视图在layoutSubviews
上执行其自己的圆角取整。 舍入实际上不是视图控制器的工作。
尝试改变
self.profileImage.layer.cornerRadius = self.profileImage.frame.size.width / 2;
至
self.profileImage.layer.cornerRadius = self.profileImage.bounds.size.width / 2;
通常,最好在内部使用边界而不是在框架内部工作,因为这是内部观点。 self.bounds将反映self.frame不会自动调整大小,自动布局,旋转,缩放和其他几何问题。 祝好运
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.