适用于Android的View.GONE可见性模式

我正在为iOS开发一个应用程序,并使用AutoLayout ON的Storyboard。 我的一个视图控制器有一组4个button,在某些情况下,我想使第一个button消失。

如果我使用setHidden:TRUE方法,那么UIButton变得不可见,但显然在视图中占用空间,结果是一个“洞”,我无法填充使剩余的UIButton浮动到顶部主视图。

在Android中,我只是简单地使用View.GONE而不是View.INVISIBLE ,但在iOS中我坚持这种行为,我不想相信唯一的解决办法是手动(是的,我的意思是编程)移动剩余元素顶部。

我以为自己能够做到这一点,设置一些约束,使所有东西都像Android一样自动化,但是我没有运气。

在我closuresAutolayout之前,有人能指点我的方向吗?

我正在使用IB,但是我也对程序化的东西感到满意。

更新:

将组件高度设置为0也没有帮助。

我尝试了这样的事情:

 UIButton *b; CGRect frameRect = b.frame; frameRect.size.height = 0; b.frame = frameRect; 

添加一个约束(NSLayoutAttributeHeight),将视图的高度设置为0为我工作:

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.captchaView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:0]]; 

为你的视图添加一个高度约束如下: 在这里输入图像说明

然后在viewController文件中为高度约束创build一个插口,如下所示: 在这里输入图像说明

&然后在您的viewDidLoad方法更改约束高度为0,如下所示:

 override func viewDidLoad() { super.viewDidLoad() nsLcButtonHeight.constant = 0 } 

所有关于这个问题的答案都是低效的。 Android设置的最佳方式setVisibility:在iOS上使用的方法是, StackView首先select组件,然后在编辑器中embedded,堆栈视图,

用IBOutlet连接新的堆栈视图,然后:

隐:

 UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = YES; 

能见度:

 UIView * firstView = self.svViewFontConfigure.arrangedSubviews[0]; firstView.hidden = NO; 

作为使用堆栈视图,所有约束将被保留!

文件

你可以做的是在堆栈视图下分组你的视图。 然后当你隐藏一个特定的视图时,剩下的视图将自动移动以填充空间。

您可能想查看堆栈视图上的Apple文档: https : //developer.apple.com/reference/uikit/uistackview

或在线教程,例如: https : //www.appcoda.com/stack-views-intro/

1)如果您的button垂直放置,则必须将height设置为0,如果水平放置button,请将width设置为0,或者将两者都设置为0。

要么

2)你可以尝试在button1上面设置button2方法:

 - (void)viewDidLoad { [super viewDidLoad]; UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button1 setTitle:@"hello" forState:UIControlStateNormal]; UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [button2 setTitle:@"world" forState:UIControlStateNormal]; [button1 sizeToFit]; [button2 sizeToFit]; [button2 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y, button2.frame.size.width, button2.frame.size.height)]; [self.view addSubview:button1]; [self.view addSubview:button2]; } 

正如我的研究表明,甚至AutoLayout都不能帮助你。 你必须手动replace受到select性显示组件影响的视图(在我的情况下,所有的视图到可选视图的底部,但是我相信你可以调整它来处理你的可选button右边的所有button):

 - (IBAction)toggleOptionalView:(id)sender { if (!_expanded) { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, _optionalHeight); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y+_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = YES; } else { self.optionalView.frame = CGRectMake(self.optionalView.frame.origin.x, self.optionalView.frame.origin.y, self.optionalView.frame.size.width, 0); self.bottomView.frame = CGRectMake(self.bottomView.frame.origin.x, self.bottomView.frame.origin.y-_optionalHeight, self.bottomView.frame.size.width, self.bottomView.frame.size.height); _expanded = NO; } } 

build议不要硬编码可选组件的高度/宽度,否则每次编辑XIB / Storyboard时都会中断代码。 我有一个字段浮动_optionalHeight我在viewDidLoad中设置,所以它始终是最新的。

你也可以清除页面,或者至less是页面的某些单元格,并重新定义整个事物。 速度快,效果很好。 我没有写代码,但在我正在开发的这个预先存在的项目中发现它。 创buildManagementTableSectionManagementTableCell类来pipe理这一切。 对不起,我不能提供更好的定义的代码。

构buildDeniz提供的答案,这里是一个在Swift中使用约束的解决scheme

例如:如果你有3个视图,A_view B_view和C_view按照这个顺序垂直alignment,你想要“隐藏”B并调整差异,添加一个约束

 B_view.removeFromSuperView() var constr = NSLayoutConstraint(item: C_view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: A_view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 20) view.addConstraint(constr) 

常量是(在这种情况下)C_view和A_view之间的垂直空间量

我添加了一个新的属性到一个名为“可见”的自定义UIView实现,当设置为false时,添加一个约束来折叠视图(我只添加了一个宽度约束,因为我的列表是水平的,但最好的方法可能是添加一个高度约束为0)。

 var visible:Bool = true{ didSet{ if(visible){ clipsToBounds = false; removeConstraint(hideConstraint!) }else{ clipsToBounds = true addConstraint(hideConstraint!) } } } 

您需要初始化视图上的零宽度约束并将其添加为字段:

 private var hideConstraint:NSLayoutConstraint? func someInitFunction(){ hideConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 0.0) ... } 

这个问题是相当古老的,但我发现最近的事情是设置额外的约束(所以“走出去”视图周围的意见知道该怎么办,一旦它失踪)

 A which you want to be A | after setting B to gone | BC | C 
  1. 设置从C到A的较低优先级(750)约束
  2. 将B的顶部和底部约束添加到NSLayoutConstraint数组bConstraints (或者如果希望视图水平折叠,则向左和向右)。 做到这一点:
    1. 控制点击并从约束拖动到ViewController
    2. 更改连接从出口到出口收集
    3. 对于名字把bConstraints
    4. 点击连接。 这将创build一个@IBOutlet var bConstraints: [NSLayoutConstraint]! 在你的ViewController
    5. 要添加其他约束:从Storyboard中的约束拖动到@IBOutletvariables名称
  3. 然后隐藏B

     B.hidden = true NSLayoutConstraint.deactivateConstraints(bConstraints) 
  4. 取消隐藏

     B.hidden = false NSLayoutConstraint.activateConstraints(bConstraints) 

显然越来越多的意见,你越来越复杂,这种增长,因为你需要从每个视图额外的约束

setHidden:TRUE / FALSE与Android View.GONE / VISIBLE最接近。

视图不一定占用空间,如果不可见!

我制作了一个ComboBox-Alike,其上放置了一个ListView。 我只在select时才可见:

在这里输入图像说明