ios - 将 UIStackView 动态调整为内部 UIView 的宽度
问题描述
我正在尝试创建一个内部包含三个 UIView 的 UIStackView。UIViews 将有一个圆圈,其中包含文本。
我不想将 StackView 设置为静态数字,我希望它能够根据用户使用的设备变得更小/增长。
现在,StackView 正在添加到视图中,并且 UIViews 正在添加到其中。正在显示颜色,但不显示圆角,并且 StackView 高度不等于 leftui 的宽度。
基本上,我需要三个高度和宽度相等的圆圈......有没有更好的方法?
这是我的代码。
@IBOutlet var stack: UIStackView!
override func viewWillLayoutSubviews() {
//let stack = UIStackView()
let leftui = UIView()
let middleui = UIView()
let rightui = UIView()
stack.addArrangedSubview(leftui)
stack.addArrangedSubview(middleui)
stack.addArrangedSubview(rightui)
leftui.backgroundColor = UIColor.red
middleui.backgroundColor = UIColor.blue
rightui.backgroundColor = UIColor.brown
leftui.bounds.size.height = leftui.bounds.width //needs these to new equal
middleui.bounds.size.height = middleui.bounds.width //needs these to new equal
rightui.bounds.size.height = rightui.bounds.width //needs these to new equal
leftui.layer.cornerRadius = leftui.bounds.size.width / 2
middleui.layer.cornerRadius = middleui.bounds.size.width / 2
rightui.layer.cornerRadius = rightui.bounds.size.width / 2
print(leftui.bounds.size.width) //prints 0.0
leftui.clipsToBounds = true
middleui.clipsToBounds = true
rightui.clipsToBounds = true
stack.sizeToFit()
stack.layoutIfNeeded()
view.addSubview(stack)
}
这是我一直在寻找的。这是来自应用程序的 android 版本。
解决方案
我认为为了UIStackView
工作,它arrangedSubviews
必须使用自动布局-在这里检查第一个答案:是否有必要使用自动布局来使用 stackview
这就是你可以解决这个问题的方法:
为您的圆形视图添加一个新类,除了将其设置为宽度的一半之外,它们并没有做太多的事情layer.cornerRadius
,因此如果高度和宽度相同,它们将是圆形的。
class CircularView: UIView {
override func layoutSubviews() {
super.layoutSubviews()
clipsToBounds = true
layer.cornerRadius = bounds.midX
}
}
您添加一个widthConstraint
您将能够在堆栈视图中调整元素大小的
var widthConstraint: NSLayoutConstraint!
然后您可以创建UIStackView
,我主要使用您的代码来执行此操作:
override func viewDidLoad() {
super.viewDidLoad()
let leftui = CircularView()
let middleui = CircularView()
let rightui = CircularView()
leftui.translatesAutoresizingMaskIntoConstraints = false
middleui.translatesAutoresizingMaskIntoConstraints = false
rightui.translatesAutoresizingMaskIntoConstraints = false
leftui.backgroundColor = UIColor.red
middleui.backgroundColor = UIColor.blue
rightui.backgroundColor = UIColor.brown
let stack = UIStackView(arrangedSubviews: [leftui, middleui, rightui])
stack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stack)
widthConstraint = leftui.widthAnchor.constraint(equalToConstant: 100)
NSLayoutConstraint.activate([
widthConstraint,
stack.centerXAnchor.constraint(equalTo: view.centerXAnchor),
stack.centerYAnchor.constraint(equalTo: view.centerYAnchor),
leftui.heightAnchor.constraint(equalTo: leftui.widthAnchor, multiplier: 1.0),
middleui.widthAnchor.constraint(equalTo: leftui.widthAnchor, multiplier: 1.0),
middleui.heightAnchor.constraint(equalTo: leftui.widthAnchor, multiplier: 1.0),
rightui.widthAnchor.constraint(equalTo: leftui.widthAnchor, multiplier: 1.0),
rightui.heightAnchor.constraint(equalTo: leftui.widthAnchor, multiplier: 1.0)
])
}
鉴于此处设置的约束,圆圈的宽度/高度将为 100,并且堆栈视图在视图中居中。
接下来,如果您想在视图旋转时做某事,您可以在您的viewController
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animate(alongsideTransition: { _ in
if size.width > size.height {
self.widthConstraint.constant = 150
} else {
self.widthConstraint.constant = 100
}
}, completion: nil)
}
它会在横向上动画成宽度/高度为 150 的圆圈。然后,您可以使用这些值来获得所需的结果。
推荐阅读
- android - 具有网格布局延伸的回收站视图中的图像
- swift - 将 macos UI 冻结 30 秒——冥想
- apache-spark - Spark 结构化流式打印每批次每执行器的偏移量
- macos - 无法在 macos 上安装 web3
- r - R 版本 3.6.1(2019-07-05)(通过自制软件安装)在使用 terrain() 函数时因 seg 错误而崩溃
- reactjs - 将firebase连接到React应用程序时如何修复“元素类型无效”
- javascript - 有没有办法使用 Firebase 在单独的 html 文件中传递登录状态?
- html - Angular - 并排显示字段
- c# - 比较 JSON 对象的 Hash
- c# - Post to web api action from another controller in the same web api