是否有与Android View.GONE等效的iOS?
在Android中,将视图设置为GONE会使其不可见,并确保视图不会占用布局中的任何空间。我知道在iOS中,您可以使用
设置隐藏视图[viewName setHidden:true];
但是视图仍然占用了布局中的空间,我认为完全删除视图并在以后重新创建它是没有效率的。
(注意:我已经看过这篇帖子:iOS equivalent for Android View.GONE visibility mode但是没有接受的答案,将高度设置为0对我来说不起作用,因为页面上的后续观点没有改变我的观点被删除了)
答案 0 :(得分:7)
使用constant
= 0添加宽度/高度约束到your View
会使your View
的宽度和高度= 0(就像它GONE
)
// set the height constraint to 0
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:0]];
// set the width constraint to 0
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:theGoneView
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:0]];
在Swift中
// set the width constraint to 0
let widthConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
view.addConstraint(widthConstraint)
// set the height constraint to 0
let heightConstraint = NSLayoutConstraint(item: theGoneView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
view.addConstraint(heightConstraint)
或者这个UIView扩展
extension UIView {
func goAway() {
// set the width constraint to 0
let widthConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.width, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
superview!.addConstraint(widthConstraint)
// set the height constraint to 0
let heightConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem: nil, attribute: NSLayoutAttribute.notAnAttribute, multiplier: 1, constant: 0)
superview!.addConstraint(heightConstraint)
}
}
希望这个帮助
答案 1 :(得分:4)
只有可能的等效物可以是AFAIK:
[yourView removeFromSuperview]
在您从view
superview
移除ios
之前,它将占用布局空间。
因此,根据您的需要,您可以在需要时添加或删除视图(与android中的view.GONE相同)。
答案 2 :(得分:2)
我目前正在使用Swift在Android和iOS之间进行转换,这是我的第一个问题。在互联网上搜索后,我发现有些人通过将UIView的高度或宽度设置为0可以获得良好的效果,具体取决于您是希望视图是垂直还是水平消失。为了在我的应用程序中实现这个想法,我定义了两个函数,如:
enum Direction {
case HORIZONTAL, VERTICAL
}
func removeView(view: UIView, direction: Direction) {
// Removing the view vertically
if direction == .VERTICAL {
let constraint = NSLayoutConstraint(item: view as UIView,
attribute: NSLayoutAttribute.Height,
relatedBy: .Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 0,
constant: 0)
view.addConstraint(constraint)
} else { // Removing the view horizontally
let constraint = NSLayoutConstraint(item: view as UIView,
attribute: NSLayoutAttribute.Width,
relatedBy: .Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 0,
constant: 0)
view.addConstraint(constraint)
}
}
// Removing the view both horizontally and vertically
func removeView(view: UIView) {
let constraintH = NSLayoutConstraint(item: view as UIView,
attribute: NSLayoutAttribute.Height,
relatedBy: .Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 0,
constant: 0)
let constraintW = NSLayoutConstraint(item: view as UIView,
attribute: NSLayoutAttribute.Width,
relatedBy: .Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 0,
constant: 0)
view.addConstraint(constraintH)
view.addConstraint(constraintW)
}
它似乎适用于模拟器。希望这会有所帮助。
答案 3 :(得分:1)
对我来说最干净的解决方案是将您想要的组件嵌入"移动"在StackView
(iOS 9.0 +)中,通过在所需视图上调用UIView.isHidden = true
,您可以实现View.GONE效果,因为StackView
包含了内容。