- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在水平 UIStackView
中嵌入了两个标签。其中一个标签可能变得太大,因此其中一个被截断。
或者,它们的大小按某种比例拆分并且垂直增长。
我想要实现的是,如果标签不合适,让 UIStackView
将 axis
更改为 vertical。
请引用下面的两张图:
图 1:标签排成一行,使用了水平轴。
图 2:其中一个标签是多行的。使用垂直轴。
使用 UICollectionViewFlowLayout 时的行为类似。
最佳答案
试一试。你只需要测量文本,你必须有一个用另一个堆栈 View 包裹的堆栈 View 。
import UIKit
class ViewController: UIViewController {
var stackView : UIStackView?
var outerStackView : UIStackView?
var label1 = UILabel()
var label2 = UILabel()
var heightAnchor : NSLayoutConstraint?
var widthAnchor : NSLayoutConstraint?
var button : UIButton?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createStackView()
createLabelsAndAddToStack()
button = UIButton(frame: CGRect(x: 20, y: self.view.frame.height - 60, width: self.view.frame.width - 40, height: 40))
button?.backgroundColor = .green
button?.setTitleColor(.black, for: .normal)
button?.setTitle("Toggle Text", for: .normal)
button?.addTarget(self, action: #selector(toggleText), for: .touchUpInside)
button?.setTitleColor(.gray, for: .highlighted)
self.view.addSubview(button!)
}
func createStackView(){
outerStackView = UIStackView(frame: CGRect(x: 20, y: 20, width: self.view.bounds.width - 40, height: 100))
outerStackView?.axis = .vertical
outerStackView?.distribution = .fill
outerStackView?.alignment = .center
outerStackView?.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(outerStackView!)
outerStackView?.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 40).isActive = true
outerStackView?.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: -40).isActive = true
outerStackView?.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 50).isActive = true
stackView = UIStackView(frame: CGRect(x: 20, y: 20, width: self.view.bounds.width - 40, height: 100))
stackView?.alignment = .center
stackView?.spacing = 20
stackView?.distribution = .fillEqually
stackView?.axis = .horizontal
outerStackView?.addArrangedSubview(stackView!)
heightAnchor = stackView?.heightAnchor.constraint(equalTo: outerStackView!.heightAnchor)
widthAnchor = stackView?.widthAnchor.constraint(equalTo: outerStackView!.widthAnchor)
}
func createLabelsAndAddToStack(){
label1 = UILabel(frame: .zero)
label1.textColor = .black
label1.font = UIFont.systemFont(ofSize: 17)
label1.text = "Label 1"
label1.numberOfLines = 0
stackView?.addArrangedSubview(label1)
label2 = UILabel(frame: .zero)
label2.font = UIFont.systemFont(ofSize: 17)
label2.textColor = .green
label2.text = "Label 2"
label2.numberOfLines = 0
stackView?.addArrangedSubview(label2)
}
func adaptStackView(){
self.outerStackView?.layoutIfNeeded()
self.stackView?.layoutIfNeeded()
//let maxWidth = label2.frame.width
//if you want it to be the max it could be
let maxWidth = (self.outerStackView!.frame.width - stackView!.spacing)/2
let height = label2.font.lineHeight
if let label1Text = label1.text{
//lets measure
if label1Text.width(withConstraintedHeight: height, font: label1.font) > maxWidth{
outerStackView?.axis = .horizontal
outerStackView?.distribution = .fill
stackView?.axis = .vertical
stackView?.distribution = .fill
stackView?.alignment = .leading
widthAnchor?.isActive = true
heightAnchor?.isActive = true
}else{
outerStackView?.axis = .vertical
outerStackView?.distribution = .fill
stackView?.alignment = .center
stackView?.axis = .horizontal
stackView?.distribution = .fillEqually
stackView?.removeConstraints(self.stackView!.constraints)
widthAnchor?.isActive = false
widthAnchor?.isActive = false
}
UIView.animate(withDuration: 0.5) {
self.view.layoutIfNeeded()
}
}
}
@objc func toggleText(){
if label1.text == "Label 1"{
label1.text = "This is some longer text to test everything out to see how we are doing"
}else{
label1.text = "Label 1"
}
adaptStackView()
}
}
extension String{
func width(withConstraintedHeight height: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height)
let boundingBox = self.boundingRect(with: constraintRect, options: [.usesLineFragmentOrigin], attributes: [.font: font], context: nil)
return ceil(boundingBox.width)
}
}
关于ios - UIStackView,2 个标签 : Change Axis based on size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50144261/
我有一个很大的 CustomView,我在上面放置了一个父 UIStackView 以包含两个 UIStackView。 每个 UIStackView 都设置为包含两个项目,每个项目均等填充。 第一个
我正在尝试使用嵌入式 UIStackViews 来获得如下所示的内容: Label1 ----------------Label2 Label3 -- 所以我在一个水平 UIStackView 中有
前言:我偷看了this post它并没有解决我的问题。这是一个 link to a repo这显示了我遇到的错误。 我有一个 UIViewController 和一个包含嵌套水平 UIStackVie
在上面的屏幕中,您可以看到我正在使用 UIStackView 来垂直填充单选按钮。问题是当我使用 stackV.alignment = .leading 时,我的单选按钮没有利用 UIStackVie
我想问一下 UIStackView() 和 UIStackView(frame: .zero) 初始化程序之间的区别。 我想知道这两者中的哪一个是由 UIStackView() 默认触发的。 @int
问题:图像占用了大部分堆栈,文本缩小了 我尝试更改内容拥抱优先级但没有任何更改! 如何使用 storyboard 在 UIStackview 中做到这一点? 我希望单元格看起来像 Eventbrigh
我正在尝试制作一个比使用 UICollectionView 更容易制作网格的 UIControl 来执行某些小任务。我正在使用 UIStackViews 的 UIStackView。那是垂直堆栈(列)
我有一个嵌套的 UIStackView,当我按下一个按钮时,它就会被实例化。更详细地说,我有一个 UIStackView,它遍历一个充满 CustomUIStackViews 的 NSMutableA
我目前正在尝试制作一个简单的应用程序,该应用程序将根据用户输入显示少量内容。目前,我的屏幕上有一个堆栈 View ,里面有一个 UIView。我试图做到这一点,一旦按下一个按钮,UIView 就会消失
https://spin.atomicobject.com/2017/02/20/uistackview-stacking-child-views/ 我正在按照本教程获取 View 堆叠并使用它们的内
每个 View 都有一个进行渲染的层。令我困惑的是,您无法为堆栈 View 设置圆角半径或边框,但当您隐藏其中一个已排列的 subview 时,其余 subview 会填满堆栈 View 。 此外,A
我正在尝试在堆栈 View 中排列一组按钮。但是,当我使用 for-each 循环来执行此操作时,按钮最终会被一个放在另一个的顶部? var stackView: UIStackView = {
我正在尝试将 UIStackView 添加到我的窗口,但它没有显示。如下所示,我已经成功添加了 UINavigationBar。我还尝试添加各种其他控件,但实际上只出现了另一个 UIView。我已经附
我有一个 UIStackView (stack1),它包含两个排列的 View :一个 UIStackView (stack2) 和一个 UIScrollView (scroll) stack2 有固
我需要在水平 UIStackView 中有 X 个按钮,它位于 UIScrollView 中。要求是按钮应该均匀分布在堆栈 View 中,并且随着按钮数量的增加我应该减少间距以使它们适合屏幕的宽度,但
我有一个 UIScrollView 可以填充所有窗口并且包含一个垂直的 UIStackView 我想在其中添加 UILabels 以填充所有可用宽度. UIStackView 固定在 UIScroll
在使用平移手势移动 UIStackView 中的元素后,我试图获取/保留该元素的句柄。 例如,我试图捕获的元素是按钮标签或文本标签文本。 代码解释... 我正在通过函数 func createButt
我在 Storyboard中定义了一个 UIStackView,第一个按钮的高度设置为 70,其他按钮的高度设置为 45。我收到此自动布局错误: [LayoutConstraints] Unable
问题很简单——我真的很喜欢用 UIStackView 来组织 UI。但是,我在测试应用程序中看不到 UIStackView 边界。当 UI 元素不是预期的时候,我需要花很多时间来调试。在网上搜索,我找
我正在尝试将 UIButtons 动态添加到 UIStackView,但遇到了一些奇怪的行为。由于按钮内的文本也是动态的,因此它应该是多行的(默认情况下不是)。所以我这样设置中断模式: button
我是一名优秀的程序员,十分优秀!