子视图出现在父视图的边框下方?

43

我有一个UIView,我是这样定义它的边框的:

self.layer.borderColor = [UIColor blackColor].CGColor;
self.layer.borderWidth = 3;

我将一个子视图附加到这个UIView,当我移动子视图超过边界时,它会被遮盖。这是预期行为吗?有没有办法让子视图在其上方?


2
苹果文档中提到:“边框是从接收器的边界向内绘制的,其值由此属性指定。它在接收器的内容和子层之上合成。”因此,边框位于您所有图层的顶部(包括子层)。 - Guo Luchuan
好的提示@GuoLuchuan!也许可以使用背景图像覆盖另一个UIView。 - LE SANG
@aăâ 是的,你说得对,可以通过制作一个背景视图来模拟边框并处理它。也许其他人有更好的方法来处理它。我们也在思考是否存在完美的方法。 - Guo Luchuan
可能是[CALayer边框出现在子视图上方(我认为与Z顺序有关)]的重复问题(https://dev59.com/xmkw5IYBdhLWcg3wbp8S)。 - Jon Schneider
4个回答

56
根据苹果规范它在接收者的内容和子层之上进行合成。 因此,边框将始终位于所有子视图之上,即使您将子视图置于最前面等等。
所以我创建了一个背景视图来模拟边框。
例如:
UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
backgroundView.backgroundColor = [UIColor blackColor];
backgroundView.clipsToBounds = NO;

UIView *bView = [[UIView alloc] initWithFrame:CGRectInset(backgroundView.bounds, 3, 3)];
bView.backgroundColor = [UIColor redColor];

UIView *cView = [[UIView alloc] initWithFrame:CGRectMake(-50, -50, 100, 100)];
cView.backgroundColor = [UIColor yellowColor];
[bView addSubview:cView];

[backgroundView addSubview:bView];

[self.window addSubview:backgroundView];

以及效果:

在此输入图片描述


我认为还可以创建一个包含边框视图和应该放在其上方的视图作为子视图的视图,然后确保先附加边框视图。 - Ser Pounce
@StackOverFlowRider,是的,你可以创建一个CustomView,它的.view就是border,而且CustomView有一个名为yourViewUIView属性。yourView是你真正有用的视图,而且yourViewCustomView的子视图之一。.view - Guo Luchuan
请确保将子视图的 #exclusiveTouch# 和 #userInteractionEnabled# 属性设置为 NO,以将触摸事件传递给按钮本身。(http://interactivelogic.net/wp/2011/07/iosdev-tip-unblock-events-caused-when-adding-subviews-to-your-uibuttons/) - Rambatino
这样做,您将无法设置清晰的背景。 - Scott Zhu

1
根据您的视图结构,将子视图添加到主视图的父级可能更容易。然后它可以重叠在主视图上,并按照您的要求覆盖边框。

0
你尝试过将父视图的 'clipsToBounds' 属性设置为 YES 吗?出于性能考虑,默认情况下该属性被设置为 NO,但将其设置为 YES 可能会达到你想要的效果。

1
我需要将其设置为“no”,因为该视图超出了其父视图的边界。 - Ser Pounce

0

在适合你的特定位置插入层:

self.layer.insertSublayer(sublayer, at: 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接