clipsToBounds 在 UIStackView 中似乎没有效果

Posted

技术标签:

【中文标题】clipsToBounds 在 UIStackView 中似乎没有效果【英文标题】:clipsToBounds seeming to have no effect in UIStackView 【发布时间】:2017-11-16 16:22:58 【问题描述】:

是否可以在UIStackView 之外渲染子视图?我有一个带有按钮和标签的垂直堆栈视图,并且我正在使用堆栈视图的宽度来适当地设置按钮的高度和宽度:

addArrangedSubview(self.loginMethodButton)
let widthConstraint = NSLayoutConstraint(item: self.loginMethodButton, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1.0, constant: 0.0)
let heightConstraint = NSLayoutConstraint(item: self.loginMethodButton, attribute: .height, relatedBy: .equal, toItem: self.loginMethodButton, attribute: .width, multiplier: 1.0, constant: 0.0)
NSLayoutConstraint.activate([widthConstraint, heightConstraint])

然后我根据情况将 viewController 中的宽度调整为适当的大小。问题是,在按钮需要的较小尺寸之一中,宽度小于其下方的标签,这会切断标签。

如果我在设置标签时调用sizeToFit(),它会起作用,但是,在设置标签后调整大小时调用sizeToFit() 仍然会导致标签被切断。在标签和堆栈视图上将 clipsToBounds 设置为 false 无效。

是否可以在堆栈视图之外渲染视图?还是我必须找到一种方法来重新处理我的约束以解决这个问题?

【问题讨论】:

检查层次结构中是否有另一个视图可能是问题所在,还要检查 UILabel breakLineMode 对我来说似乎是 truncateTail 而不是 wordBreak 它需要放在一行中,文本只是说Touch IDPasscode,因此不能接受换行符。至于视图层次结构,它都是在UIStackView 的子类中以编程方式创建的,我的setUpView 方法只添加了两个排列好的视图,标签和按钮,所以不应该有任何额外的视图。 【参考方案1】:

UIStackView 是一个“非渲染”对象......它所做的只是安排其他视图。

如果问题是您的 UILabel 太宽而无法放入 Stack View 提供的区域,那么您需要将标签设置为“自动缩小”字体,或者您需要更改您的堆栈视图约束以允许更宽的标签。

编辑 根据您的其他评论,以下内容不正确。

您需要在“包含”视图上设置.clipsToBounds...根据您显示的图形,这将是深蓝色框(我假设这是带有图像的UIView 和标记为子视图)。

【讨论】:

Shoot.... 那个蓝色框只是它所在的背景。这个垂直的 stackView 被安排在一个水平的堆栈视图内,它被放置在屏幕上,所以“包含”视图将一直到达我的主视图控制器的视图,设置 clipsToBounds 没有影响。编辑:射击,我现在正试图找出一个改变我的约束的好方法。 如果它是“非渲染”对象,为什么它有背景色? @Ahmadreza - 这是一个旧答案......虽然它仍然解决了 OP 的问题,但 UIStackView 已更改为 ios 14(在发布此答案后)。解释见这篇文章:useyourloaf.com/blog/stack-view-background-color-in-ios-14

以上是关于clipsToBounds 在 UIStackView 中似乎没有效果的主要内容,如果未能解决你的问题,请参考以下文章

clipsToBounds 在 UIStackView 中似乎没有效果

UICollectionView、分页和 clipsToBounds [重复]

UIView clipsToBounds不起作用

NSView如何实现类似于UIView中的clipsToBounds功能(即不切割其SubView)

clipsToBounds / maskToBounds 不适用于表格视图单元格中的图像视图?

clipsToBounds 导致 UIImage 在 iOS10 和 XCode 8 中不显示