UIStackView中的clipsToBounds似乎没有效果

8

有没有可能让子视图在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中根据情况调整宽度以适当的尺寸。问题是,在其中一个较小的尺寸中,按钮需要的宽度比其下方的标签还要小,这会导致标签被截断。

enter image description here

如果我在设置标签时调用sizeToFit(),它能够正常工作,但是在设置标签后调整大小时调用sizeToFit()仍然导致标签被截断。将clipsToBounds设置为false对标签和堆栈视图都没有影响。
是否有可能在堆栈视图之外呈现视图?还是我必须找到一种重新设计约束以解决此问题的方法?

请检查您在层次结构中是否有另一个视图,也请检查UILabel的breakLineMode,因为它对我来说似乎是truncateTail而不是wordBreak。 - Reinier Melian
它需要适合单个线路,文本只是在简单地说“Touch ID”或“Passcode”,因此不会接受断行符。至于视图层次结构,在UIStackView的子类中通过编程方式全部创建,我的setUpView方法只会添加两个排列视图,标签和按钮,因此不应该有任何额外的视图。 - Bill L
1个回答

6

UIStackView是一个"非渲染"对象...它的作用仅仅是布置其他视图。

如果问题在于您的UILabel太宽以至于无法适应Stack View提供的区域,则需要将标签设置为"自动缩小"字体,或者您需要修改Stack View约束以允许更宽的标签。

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

您需要在"包含"视图上设置.clipsToBounds...根据您显示的图片,那将是较暗蓝色方框(我假设这是一个具有图像和标签作为子视图的UIView)。


射......那个蓝色的框只是它所在的背景。这个垂直的stackView被安排在一个水平的stackView内部,该水平的stackView被布局在屏幕上,因此“包含”视图将一直延伸到我的主视图控制器的视图,设置clipsToBounds不会产生影响。编辑:射击,我现在正在尝试找出一种良好的方法来修改我的约束。 - Bill L
如果这是一个“非渲染”对象,为什么它有背景颜色呢? - Ahmadreza
1
@Ahmadreza - 这是一个旧答案...虽然它仍然解决了OP的问题,但iOS 14之后,UIStackView已经发生了变化(在此答案发布之后)。请参阅此文章以获取说明:https://useyourloaf.com/blog/stack-view-background-color-in-ios-14/ - DonMag

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