使用将 maskToBounds 设置为 true 和cornerRadius 不会更改视图

Posted

技术标签:

【中文标题】使用将 maskToBounds 设置为 true 和cornerRadius 不会更改视图【英文标题】:Using maskToBounds set to true with cornerRadius doesn't change the view 【发布时间】:2017-09-20 08:54:21 【问题描述】:

我创建了一个简单的文本字段来试验cornerRadius 和 maskToBounds,并认为如果我想圆角文本字段的角,除了设置图层的角半径之外,我还需要将图层的 maskToBounds 设置为 true,像这样:

myTextField.layer.borderWidth = 1
myTextField.layer.cornerRadius = 3
myTextField.layer.masksToBounds = true
myTextField.textAlignment = .center

但是,当我注释掉 myTextField.layer.masksToBounds = true 时,文本字段仍然以圆角呈现在屏幕上。

那么究竟什么时候需要使用 maskToBounds,为什么这里不需要呢? 整个屏幕的背景颜色为白色,textField 内没有任何其他元素的图像。

【问题讨论】:

我认为您在主视图中添加直接添加文本字段,因此不需要掩码,但您添加一个视图,然后在视图中添加文本字段,然后强制掩码。 “这取决于masksToBounds,它确定子图层是否被裁剪到接收器的边界。因此,如果是,则将与图层边界匹配的隐式蒙版应用于图层,包括cornerRadius属性的效果。” 抱歉,您能改写一下吗?我认为您的观点很好,但我无法完全理解您在第一句话中所说的内容。您的意思是不需要 maskToBounds 因为我将文本字段添加到主视图(顺便说一句,我是:))。但是其余的“但是您添加一个视图然后在视图中添加文本字段然后强制掩码”是什么意思? 这意味着您在视图中添加文本字段,然后您没有设置 masktobounds 文本字段不存在圆角。 好的,你能给我一些常用的例子,说明你什么时候可以在另一个视图(不是主视图)中包含一个文本字段?请随意将其放入答案表格中,以便我接受。感谢您的帮助。 【参考方案1】:

我认为,

这取决于masksToBounds,它决定子层是否被裁剪到接收者的边界。所以如果是的话,一个与图层边界匹配的隐式掩码将应用于图层,包括cornerRadius属性的效果。

shadow 是在 View 外部完成的效果,将 maskToBounds 设置为 YES 会告诉 UIView 不要绘制任何在其外部的东西。

例如

如果您在具有图像内容的 CALayer 上设置,图像仍将绘制在圆角半径边界之外。您可以通过将 sublayer maskToBounds 设置为 True 来解决此问题,但您没有将 masktobounds 设置为 true,因为此时阴影不会显示,因为它们会被屏蔽掉。

【讨论】:

另一个愚蠢的问题,但是当您将文本字段添加到主视图时,为什么它会有所不同(即为什么您不需要将 maskToBounds 设置为 true)? (根据您的示例,与主视图内的另一个视图相反?)。仅仅是因为层次结构中没有其他视图(或层)吗?

以上是关于使用将 maskToBounds 设置为 true 和cornerRadius 不会更改视图的主要内容,如果未能解决你的问题,请参考以下文章

设置 CALayer maskToBounds 导致图层消失

WPFのclipToBounds与maskToBounds的区别

WPFのclipToBounds与maskToBounds的区别

如何在 CAShapeLayer(Rounded-Recr 角 UIView)上设置 maskToBounds 效果?

UITableViewCell 在子视图性能问题中调用 .layer.maskToBounds = YES [重复]

使视图在没有 maskToBounds 的情况下为圆形