1

我正在尝试为应用程序加载配置文件图像,但我想为其添加一个白色边框并在显示之前使其变为圆形。为了做到这一点,我在 UIImageView 上设置了图像属性,然后通过设置适当的角半径来准备图像,将其屏蔽到边界,然后添加一个白色边框子层。最初,我通过互联网异步加载图像,一切正常,因为图像出现在视图出现之后。但是,当我缓存图像并尝试在 imageView 显示在屏幕上之前准备它时,我无法显示边框子层。它仍然被正确掩盖,只是没有边框。我用来准备图像的代码如下。

- (void)prepareProfileImage
{
    CALayer *imageLayer = self.profileImageView.layer;
    imageLayer.borderColor = [UIColor whiteColor].CGColor;
    imageLayer.allowsEdgeAntialiasing = NO;
    [imageLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0];
    [imageLayer setMasksToBounds:YES];

    CALayer *borderLayer = [CALayer layer];
    CGRect borderFrame = CGRectMake(-1.0, -1.0, (self.profileImageView.frame.size.width+2.0), (self.profileImageView.frame.size.height+2.0));
    [borderLayer setBackgroundColor:[[UIColor whiteColor] CGColor]];
    [borderLayer setFrame:borderFrame];
    [borderLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0];
    [borderLayer setBorderWidth:PROFILE_IMAGE_BORDER_WIDTH+1.0];
    [borderLayer setBorderColor:[UIColor whiteColor].CGColor];

    [imageLayer addSublayer:borderLayer];
}

这个方法只要在viewDidLoad之后调用就可以正常工作,但是如果在viewDidLoad之前调用就不会添加边框层。我已经确认在这个方法调用的时候已经分配了self.profileImageView,但是我只得到了圆形图像,没有边框。

我对CALayers有什么误解吗?将图层添加为子图层时是否重要?

我没有直接在图像层上使用边框属性的原因是它会在外面留下一小块令人不快的图像。

4

2 回答 2

1

我找到了答案!问题是我想使用 profileImageView 框架设置边框层的框架,但是因为我使用的是自动布局,所以直到视图显示在屏幕上之后才设置该属性。

我最终做了:

 /*! This function adds a border layer to the profile image view. */
- (void)addBorderLayerToProfileImageView {
    CALayer *borderLayer = [CALayer layer];
    CGRect borderFrame = CGRectMake(-1.0, -1.0, (PROFILE_IMAGE_DIAMETER+2.0), (PROFILE_IMAGE_DIAMETER+2.0));
    [borderLayer setBackgroundColor:[[UIColor clearColor] CGColor]];
    [borderLayer setFrame:borderFrame];
    [borderLayer setCornerRadius:PROFILE_IMAGE_DIAMETER/2.0];
    [borderLayer setBorderWidth:PROFILE_IMAGE_BORDER_WIDTH+1.0];
    [borderLayer setBorderColor:[UIColor whiteColor].CGColor];
    [self.profileImageView.layer addSublayer:borderLayer];
}

我完全添加边框层的原因是因为层上的边框在图像视图的边缘和边框之间留下了一个小工件。

于 2013-08-20T23:13:48.203 回答
1

我遇到了和你一样的问题:子层不可见,除非我调用它viewDidAppear

我看到了你的答案,但它对我不起作用。我正在使用 AutoLayout,所以我需要一个动态的解决方案,不知道我的视图的高度或宽度。我frame.size的观点是,我试图添加一个图层,直到viewDidAppear(有意义)的高度和宽度值为 0。

在了解了 and 的生命周期的更多信息后UIViewUIViewController我的解决方案是使用layoutSubviews()我的自定义功能UIView将子视图添加到其中,因为 AutoLayout 已经测量了该点的视图。

您还可以UIViewControllerviewDidLayoutSubviews()函数中的 a 中向子视图添加图层,因为 AutoLayout 也通过这一点进行了测量。

于 2019-01-28T16:08:35.600 回答