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 ID
或Passcode
,因此不能接受换行符。至于视图层次结构,它都是在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 [重复]
NSView如何实现类似于UIView中的clipsToBounds功能(即不切割其SubView)