为什么掩码不能在UISearchBar上运行

时间:2011-02-07 11:07:09

标签: iphone ios core-animation calayer uisearchbar

我正在尝试在左上角和右上角为UISearchBar添加圆角。

但是,我发现无论我如何设置它,掩码层都无法在UISearchBar上运行。

这是我的代码

    // UIView* bar = [searchBar_.subviews objectAtIndex:0]; // try to add mask to background view but also failed

    UIView* bar = searchBar_;
    CGRect toolbarBounds = bar.bounds;
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect: toolbarBounds
                                               byRoundingCorners:UIRectCornerTopLeft 
                                                     cornerRadii:CGSizeMake(5.0f, 5.0f)];
    [maskLayer setPath:[path CGPath]];
    [maskLayer setFillColor:[[UIColor greenColor] CGColor]];
    bar.layer.masksToBounds = YES;
    bar.layer.mask = maskLayer;

我也尝试过“剪辑子视图”,但它也不起作用。

然后我尝试更多,我只是设置隐藏的背景视图(子视图0)。令人惊讶的是,它仍然可见。

UISearchBar有什么魔力吗? 掩码可以在UIToolbar上运行。

1 个答案:

答案 0 :(得分:0)

您的问题可能与mask属性的实现方式有关。如果将遮罩层添加到已经是层次结构的一部分的图层中,它将无法工作。 CALayer的文档说:

  

mask设置为新图层时,必须先将新图层的超级图层设置为nil,否则行为未定义。

在添加遮罩层之前,您必须从superview中删除搜索栏。像这样包裹你的最后一行:

UIView *superview = [bar superview];
[bar removeFromSuperview];
bar.layer.mask = maskLayer;
[superview addSubview:bar];

如果您愿意,也可以使用removeFromSuperlayeraddSublayer:。此外,如果您的搜索栏不是层次结构中最顶层的视图,请务必找出它的位置,并使用insertSubview:atIndex:或其中一种类似方法将其放回正确的位置。