在我的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”,并没有在适当的时候同时加载所有内容。
关于我应该尝试什么的任何想法?
答案 0 :(得分:1)
问题是你使用sone背景线程技术加载图像,第一次这样做时,它必须从某个地方获取图像,第二次它可能是一个缓存版本所以它可以立即运行完成块。
这为什么重要?
在viewDidLoad
,在Autolayout下,您的图片视图的框架将为零,但您仍然使用它来围绕角落。
在第一次运行时,加载图像的延迟足以使视图执行布局传递,因此它可以正确地舍入。在第二次运行时,它没有(因为图像被缓存),所以它不能。
正如您已经发现的那样,解决方案是在布局发生时设置角半径 - 在viewDidLayoutSubviews
或viewDidAppear
中。设置半径可以与加载图像完全分开,并且不是" hacky"一点都不。
更好的解决方案是编写一个图像视图子类,在layoutSubviews
上执行它自己的圆角。这种四舍五入不是视图控制器的工作。
答案 1 :(得分:0)
尝试更改
self.profileImage.layer.cornerRadius = self.profileImage.frame.size.width / 2;
到
self.profileImage.layer.cornerRadius = self.profileImage.bounds.size.width / 2;
一般来说,内部使用bounds而不是frame rect更好,因为这是内部透视图。 self.bounds将反映自动化,自动布局,旋转,缩放和self.frame不会出现的其他几何问题。祝你好运