除非在viewDidAppear之后添加,否则子图层不可见

时间:2013-08-20 22:47:11

标签: uiimageview uiimage calayer viewdidappear

我正在尝试为应用加载配置文件图片,但我想在显示它之前为其添加白色边框并使其成为圆形。为了做到这一点,我在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有什么误解吗?将图层添加为子图层时,它是否重要?

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

2 个答案:

答案 0 :(得分:1)

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

我最终做了:

 /*! 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];
}

我添加边框图层的原因是因为图层边框在图像视图的边缘和边框之间留下了一个小的神器。

答案 1 :(得分:0)

我遇到了与您相同的问题:子层不可见,除非我在viewDidAppear上对其进行了调用。

我看到了你的答案,但对我没有用。我正在使用自动版式,因此我需要一个动态的解决方案,而不知道我的视图的高度或宽度。我尝试添加的图层frame.size的高度和宽度值为0,直到viewDidAppear(有意义)。

在详细了解UIViewUIViewController的生命周期之后,对我来说,解决方案是使用自定义layoutSubviews()的{​​{1}}函数向其添加子视图因为AutoLayout当时已测量视图。

您也可以在UIView函数的UIViewController中的子视图中添加图层,这也是AutoLayout在这一点上的度量。