iOS:更改 StackView 中 TextField 的高度(在 StackView 内)
Posted
技术标签:
【中文标题】iOS:更改 StackView 中 TextField 的高度(在 StackView 内)【英文标题】:iOS: Change height of TextField in StackView (inside StackView) 【发布时间】:2019-04-11 15:03:09 【问题描述】:我正在使用 Xcode 10/Swift 5/ios 12 并得到了这个布局:
红色(垂直)StackView设置为:
分布:“均等填充” 高度:300(固定) 框架:10 个(每边) 间距:105 个水平子 StackViews:
分布:“均等填充” 每个高 52 像素 ((300-40)/5) - 不固定!蓝色 View 只占用剩余的屏幕空间(顶部与红色 StackView 对齐,底部与“SuperView”对齐)。
标签自动占用 52 像素,但我希望两个 TextField 正好是 30 像素(上方/下方 +11)。如果我只是设置高度,InterfaceBuilder 会抱怨冲突并且实际上并没有改变任何东西。
如何在不改变周围水平 StackView 高度的情况下设置它们的高度?
【问题讨论】:
只需在情节提要中为每个文本字段设置 contentHugging 优先级和 compressionResistance 优先级即可。 @PranavKasetti 抱歉,to required
是什么意思?我知道在哪里设置“优先级”值(在“尺寸检查器”中),但我看不到它们的任何其他设置。
必填表示最大值(1000)
@PranavKasetti 我将第一个 TextField 的两个“垂直”优先级都设置为“1000”,但这并没有改变任何东西 - 它仍在抱怨冲突。
尝试将水平堆栈视图的对齐方式设置为fill而不是fillEqually,并改用宽度约束
【参考方案1】:
这是一种解决方案 - 假设您希望堆栈视图中的每一“行”高 52 磅(标签具有绿色背景,只是为了使其框架更易于查看)。
红栈视图:
Alignment: Fill
Distribution: Fill Equally
Spacing: 10
每个水平堆栈视图:
Alignment: Center
Distribution: Fill Equally
Spacing: 0
Red View
- 包含 Red Stack View
和 Blue View
- 在所有四个侧面都被限制在零到 SuperView。
Red Stack View
在 10 点处被限制在其 SuperView(即 Red View
)的 Top、Leading 和 Trailing。
唯一的高度约束设置在Date Stack View
... Height = 52
。由于Red Stack View
将其分布设置为Fill Equally
,剩余的水平堆栈视图将自动获得52 的高度。
并且,通过在每个水平堆栈视图上设置 Alignment: Center
,排列的子视图将居中对齐到该 52-pt 高度。
【讨论】:
"Center" 成功了,谢谢!我只是将其余部分保持原样 - 包括 300 的总高度(如果需要,更改它,这样更容易 imo)并为每个标签添加 2 个约束以将顶部和底部与其父 StackView 对齐。 Another question that's related to the layout in my question: Tinting a StackView doesn't work,似乎你只能改变普通视图的背景颜色,标签,......如果我想给我的“Date StackView”一个绿色背景色,我知道我可以将标签和文本字段放在自己的视图中,然后更改它们的颜色。但是有没有更简单的方法? 来自 Apple 文档:"UIStackView
是 UIView
的非渲染子类;也就是说,它不提供任何自己的用户界面。相反,它只管理位置和其排列视图的大小。” 因此,唯一的方法是将元素嵌入到其他视图中。
抱歉,还有一个问题:如何在标签文本的左侧添加填充但仍在标签内?所以例如绿色标签内有 5pts 的绿色可用空间,然后文本才开始。有没有比在文本中添加空格更好的方法?
您可以使用带有缩进段落样式的属性文本,或者... 将标签嵌入到带有前导约束的UIView
中,或者... 子类UILabel
并覆盖drawTextInRect:
,或... 搜索 uilabel insets
会返回各种其他方法。以上是关于iOS:更改 StackView 中 TextField 的高度(在 StackView 内)的主要内容,如果未能解决你的问题,请参考以下文章
使用swift在scrollview内的stackview中更改uibutton中的标题