Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UISTK视图和子视图大小类_Ios_Uistackview - Fatal编程技术网

Ios UISTK视图和子视图大小类

Ios UISTK视图和子视图大小类,ios,uistackview,Ios,Uistackview,我有一个视图,中间的按钮只在不同大小的类中可见 旋转设备后,按钮将可见,因为它的大小类别也在右视图层次结构(图像)中,但它没有足够的UIstackview给定的约束来正确定位,它位于左上角(标签中间) 工作按钮(不受大小类更改的影响)具有更多的约束 这是一个错误还是我遗漏了什么。 有人知道解决方法吗?这肯定是iOS中的一个bug。安装中间按钮后,它将被添加为堆栈视图的子视图,而不是排列的子视图 这里有一个解决办法。将中间按钮的自定义类设置为StackViewBugFixButton。然后将中

我有一个视图,中间的按钮只在不同大小的类中可见

旋转设备后,按钮将可见,因为它的大小类别也在右视图层次结构(图像)中,但它没有足够的UIstackview给定的约束来正确定位,它位于左上角(标签中间)

工作按钮(不受大小类更改的影响)具有更多的约束

这是一个错误还是我遗漏了什么。
有人知道解决方法吗?

这肯定是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
        }
    }

}