Ios UISTK视图和子视图大小类
我有一个视图,中间的按钮只在不同大小的类中可见 旋转设备后,按钮将可见,因为它的大小类别也在右视图层次结构(图像)中,但它没有足够的UIstackview给定的约束来正确定位,它位于左上角(标签中间) 工作按钮(不受大小类更改的影响)具有更多的约束 这是一个错误还是我遗漏了什么。Ios UISTK视图和子视图大小类,ios,uistackview,Ios,Uistackview,我有一个视图,中间的按钮只在不同大小的类中可见 旋转设备后,按钮将可见,因为它的大小类别也在右视图层次结构(图像)中,但它没有足够的UIstackview给定的约束来正确定位,它位于左上角(标签中间) 工作按钮(不受大小类更改的影响)具有更多的约束 这是一个错误还是我遗漏了什么。 有人知道解决方法吗?这肯定是iOS中的一个bug。安装中间按钮后,它将被添加为堆栈视图的子视图,而不是排列的子视图 这里有一个解决办法。将中间按钮的自定义类设置为StackViewBugFixButton。然后将中
有人知道解决方法吗?这肯定是iOS中的一个bug。安装中间按钮后,它将被添加为堆栈视图的子视图,而不是排列的子视图 这里有一个解决办法。将中间按钮的自定义类设置为
StackViewBugFixButton
。然后将中间按钮的(新)priorView
出口连接到左侧的下一个按钮。以下是StackViewBugFixButton
的定义:
StackViewBugFixButton.h
你会得到一个虚假的警告“你忘了连接我的优先存储插座”,因为在加载过程中,在连接插座之前,该视图被添加为堆栈视图的子视图。这肯定是iOS中的一个bug。安装中间按钮后,它将被添加为堆栈视图的子视图,而不是排列的子视图 这里有一个解决办法。将中间按钮的自定义类设置为
StackViewBugFixButton
。然后将中间按钮的(新)priorView
出口连接到左侧的下一个按钮。以下是StackViewBugFixButton
的定义:
StackViewBugFixButton.h
您将收到一条虚假警告“您忘记连接我的优先存储插座”,因为在加载过程中,在连接插座之前,该视图被添加为堆栈视图的子视图。多亏了Rob,我用swift创建了以下解决方案,您必须在用户定义的运行时值中将controlIndex设置为正确的索引 ()
多亏了Rob,我用swift创建了以下解决方案,您必须在用户定义的运行时值中将controlIndex设置为正确的索引 ()
Rob和Uwe提供的解决方案确实有效,解决了有条件安装的视图在特征集合更改时未添加到
ArrangedSubview
的问题
我更愿意解决这个问题,而不必对我希望放置在UIStackView
中的每个视图进行子类化,因此我对UIStackView
本身进行子类化,以覆盖layoutSubviews()
,并将孤立子视图添加到arrangedSubviews
:
class ManagedStackView: UIStackView {
override func layoutSubviews() {
super.layoutSubviews()
let unarrangedSubviews = subviews.filter({ !arrangedSubviews.contains($0) })
unarrangedSubviews.forEach({ insertArrangedSubview($0, atIndex: $0._arrangedSubviewIndex) })
}
}
extension UIView {
private var _arrangedSubviewIndex: Int {
get {
return tag
}
set {
tag = newValue
}
}
}
Rob和Uwe提供的解决方案确实有效,解决了有条件安装的视图在特征集合更改时未添加到
ArrangedSubview
的问题
我更愿意解决这个问题,而不必对我希望放置在UIStackView
中的每个视图进行子类化,因此我对UIStackView
本身进行子类化,以覆盖layoutSubviews()
,并将孤立子视图添加到arrangedSubviews
:
class ManagedStackView: UIStackView {
override func layoutSubviews() {
super.layoutSubviews()
let unarrangedSubviews = subviews.filter({ !arrangedSubviews.contains($0) })
unarrangedSubviews.forEach({ insertArrangedSubview($0, atIndex: $0._arrangedSubviewIndex) })
}
}
extension UIView {
private var _arrangedSubviewIndex: Int {
get {
return tag
}
set {
tag = newValue
}
}
}
虽然可接受的答案应作为编程方法使用,但值得注意的是,您可以通过为隐藏的属性而不是已安装的属性添加大小类变量,在Interface Builder中避免此问题。iOS正确地处理了这种情况,因为
arrangedSubviews
实际上从未更改,而且UIStackView
也没有更改
例如,如果要隐藏压缩宽度的特定视图,则子视图的IB配置如下所示。请注意,视图已安装在所有尺寸等级中:
虽然公认的答案应该作为一种编程方法,但值得注意的是,您可以通过为隐藏的属性而不是安装的属性添加大小类变量,在Interface Builder中避免此问题。iOS正确地处理了这种情况,因为
arrangedSubviews
实际上从未更改,而且UIStackView
也没有更改
例如,如果要隐藏压缩宽度的特定视图,则子视图的IB配置如下所示。请注意,视图已安装在所有尺寸等级中:
太好了,这很好,我做了一点修改,因为我不喜欢插座和拖放,但本质上是你的解决方案,我会把它作为我自己问题的答案发布。太好了,这很好,我做了一点修改,因为我不喜欢插座和拖放,但本质上是你的解决方案,我会把它贴出来作为我自己问题的答案
import UIKit
class UIButtonFixForStackView: UIButton {
var controlIndex:Int = 0
internal override func didMoveToSuperview() {
if (superview?.isKindOfClass(UIStackView) == false)
{
return
}
if let stackView = self.superview as? UIStackView
{
if stackView.arrangedSubviews.indexOf(self) != nil
{
return
}
stackView.insertArrangedSubview(self, atIndex: controlIndex)
}
}
}
class ManagedStackView: UIStackView {
override func layoutSubviews() {
super.layoutSubviews()
let unarrangedSubviews = subviews.filter({ !arrangedSubviews.contains($0) })
unarrangedSubviews.forEach({ insertArrangedSubview($0, atIndex: $0._arrangedSubviewIndex) })
}
}
extension UIView {
private var _arrangedSubviewIndex: Int {
get {
return tag
}
set {
tag = newValue
}
}
}