我想在两个开关 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)
答案 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
,然后在您希望它可见时进行相反操作