UIimageView掩盖成钻石

时间:2014-12-30 18:41:43

标签: ios objective-c uiimageview

在我的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”,并没有在适当的时候同时加载所有内容。

关于我应该尝试什么的任何想法?

2 个答案:

答案 0 :(得分:1)

问题是你使用sone背景线程技术加载图像,第一次这样做时,它必须从某个地方获取图像,第二次它可能是一个缓存版本所以它可以立即运行完成块。

这为什么重要?

viewDidLoad,在Autolayout下,您的图片视图的框架将为零,但您仍然使用它来围绕角落。

在第一次运行时,加载图像的延迟足以使视图执行布局传递,因此它可以正确地舍入。在第二次运行时,它没有(因为图像被缓存),所以它不能。

正如您已经发现的那样,解决方案是在布局发生时设置角半径 - 在viewDidLayoutSubviewsviewDidAppear中。设置半径可以与加载图像完全分开,并且不是" 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不会出现的其他几何问题。祝你好运