如何切换可见性GONE和VISIBLE swift

时间:2017-08-21 09:13:24

标签: ios swift3 visibility

我想在两个开关 GONE VISIBLE 之间切换 我在Android上很容易做到这一点,但我真的不知道该怎么办 swift 在标签中尝试此代码

// set the width constraint to 0
  let widthConstraint = NSLayoutConstraint(item:  self.labelShortDescription, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
  self.labelShortDescription.addConstraint(widthConstraint)

// set the height constraint to 0
   let heightConstraint = NSLayoutConstraint(item:  self.labelShortDescription, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
   self.labelShortDescription.addConstraint(heightConstraint)

6 个答案:

答案 0 :(得分:2)

不可见:

  

此视图不可见,但仍占用布局空间   目的。

要在iOS中实现这一目标:

yourView.alpha = 0

GONE:

  

此视图不可见,并且不占用任何布局空间   目的。

要在iOS中实现这一目标:

yourView.removeFromSuperview()

答案 1 :(得分:0)

为了更新视图的可见性,您可以使用名为“isVisible”的属性

myCustomView?.isVisible 

如果您需要查看视图是否仍然是视图层次结构的一部分,您可以使用应包含该视图的超级视图中的subviews属性进行检查

myController.view.subviews.contains(myCustomView)

要考虑的其他方面

myCustomView?.alpha = 0 //(visible but transparent)
myCustomView == nil //(not initialized)

答案 2 :(得分:0)

具有更改isHidden和更改约束值的更改可见性

有效:

func visibilityLogo(visibility : Bool){

        self.img.isHidden = !visibility
        self.viewImageConstrain.constant = visibility ? 50 : 0
        self.viewConttrainParent.constant = visibility ? 50 : 0
        self.img.layoutIfNeeded()
    }

答案 3 :(得分:0)

extension UIView {

    func visiblity(gone: Bool, dimension: CGFloat = 0.0, attribute: NSLayoutAttribute = .height) -> Void {
        if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
            constraint.constant = gone ? 0.0 : dimension
            self.layoutIfNeeded()
            self.isHidden = gone
        }
    }
}

答案 4 :(得分:0)

我迅速编写了一个UIView扩展名,以类似于Android SDK的视图可见性管理视图可见性。

此扩展自动添加所需的约束以垂直,水平或同时折叠这两个视图。这些约束不会多次添加,只有在可见性类型为 gone goneY goneX 时才需要。当可见性再次动态更改为可见或不可见状态时,它们会自动设置为不活动可见不可见状态由isHidden属性管理,因此视图将不可见,但仍会占用空间。

扩展名

extension UIView {

    // MARK: visibility methods

    public enum Visibility : Int {
        case visible = 0
        case invisible = 1
        case gone = 2
        case goneY = 3
        case goneX = 4
    }

    public var visibility: Visibility {
        set {
            switch newValue {
                case .visible:
                    isHidden = false
                    getConstraintY(false)?.isActive = false
                    getConstraintX(false)?.isActive = false
                case .invisible:
                    isHidden = true
                    getConstraintY(false)?.isActive = false
                    getConstraintX(false)?.isActive = false
                case .gone:
                    isHidden = true
                    getConstraintY(true)?.isActive = true
                    getConstraintX(true)?.isActive = true
                case .goneY:
                    isHidden = true
                    getConstraintY(true)?.isActive = true
                    getConstraintX(false)?.isActive = false
                case .goneX:
                    isHidden = true
                    getConstraintY(false)?.isActive = false
                    getConstraintX(true)?.isActive = true
            }
        }
        get {
            if isHidden == false {
                return .visible
            }
            if getConstraintY(false)?.isActive == true && getConstraintX(false)?.isActive == true {
                return .gone
            }
            if getConstraintY(false)?.isActive == true {
                return .goneY
            }
            if getConstraintX(false)?.isActive == true {
                return .goneX
            }
            return .invisible
        }
    }

    fileprivate func getConstraintY(_ createIfNotExists: Bool = false) -> NSLayoutConstraint? {
        return getConstraint(.height, createIfNotExists)
    }

    fileprivate func getConstraintX(_ createIfNotExists: Bool = false) -> NSLayoutConstraint? {
        return getConstraint(.width, createIfNotExists)
    }

    fileprivate func getConstraint(_ attribute: NSLayoutConstraint.Attribute, _ createIfNotExists: Bool = false) -> NSLayoutConstraint? {
        let identifier = "random_id"
        var result: NSLayoutConstraint? = nil
        for constraint in constraints {
            if constraint.identifier == identifier {
                result = constraint
                break
            }
        }
        if result == nil && createIfNotExists {
            // create and add the constraint
            result = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: 0)
            result?.identifier = identifier
            addConstraint(result!)
        }
        return result
    }
}

用法

myView.visibility = .visible
myView.visibility = .invisible
myView.visibility = .gone
myView.visibility = .goneX
myView.visibility = .goneY

答案 5 :(得分:0)

这是对Farshid roohi的回答的阐述:https://stackoverflow.com/a/51130160/826946

您要做的是在情节提要中创建一个约束,以定义字段的高度。如果您没有使用固定的高度,它将更加复杂,但是您应该从此答案中得到启发。 因此,您可以为字段创建高度限制。 然后,在代码中为约束创建一个IBOutlet,如下所示:

@IBOutlet weak var myItemsHeight: NSLayoutConstraint!

在情节提要中,选择约束,然后将其引用出口连接到上面刚刚定义的变量。就像为视图创建引用出口一样,但是您在左侧的Storyboard导航器中的选择应基于实际约束,而不是您要约束的视图。

现在在您的代码中,当您希望该项目消失时,您可以进行设置:

myItemsHeight.constant = 0

当您希望它可见时,可以将其高度设置为任何高度。

如果您想成为更幻想的人并将所有布局信息保留在情节提要中,则可以创建两个高度限制,一个高度限制为0,另一个高度限制为您想要的高度。然后在代码中,当您希望该商品消失时,您将执行以下操作:

myItemGoneConstraint.priority = 1000
myItemVisibleConstraint.priority = 0

,然后在您希望它可见时进行相反操作