我正在尝试在左上角和右上角为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上运行。
答案 0 :(得分:0)
您的问题可能与mask
属性的实现方式有关。如果将遮罩层添加到已经是层次结构的一部分的图层中,它将无法工作。 CALayer
的文档说:
将
mask
设置为新图层时,必须先将新图层的超级图层设置为nil
,否则行为未定义。
在添加遮罩层之前,您必须从superview
中删除搜索栏。像这样包裹你的最后一行:
UIView *superview = [bar superview];
[bar removeFromSuperview];
bar.layer.mask = maskLayer;
[superview addSubview:bar];
如果您愿意,也可以使用removeFromSuperlayer
和addSublayer:
。此外,如果您的搜索栏不是层次结构中最顶层的视图,请务必找出它的位置,并使用insertSubview:atIndex:
或其中一种类似方法将其放回正确的位置。