适用于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是页面的某些单元格,并重新定义整个事物。 速度快,效果很好。 我没有写代码,但在我正在开发的这个预先存在的项目中发现它。 创buildManagementTableSection
和ManagementTableCell
类来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
- 设置从C到A的较低优先级(750)约束
- 将B的顶部和底部约束添加到NSLayoutConstraint数组
bConstraints
(或者如果希望视图水平折叠,则向左和向右)。 做到这一点:- 控制点击并从约束拖动到ViewController
- 更改连接从出口到出口收集
- 对于名字把
bConstraints
。 - 点击连接。 这将创build一个
@IBOutlet var bConstraints: [NSLayoutConstraint]!
在你的ViewController - 要添加其他约束:从Storyboard中的约束拖动到@IBOutletvariables名称
-
然后隐藏B
B.hidden = true NSLayoutConstraint.deactivateConstraints(bConstraints)
-
取消隐藏
B.hidden = false NSLayoutConstraint.activateConstraints(bConstraints)
显然越来越多的意见,你越来越复杂,这种增长,因为你需要从每个视图额外的约束
setHidden:TRUE / FALSE与Android View.GONE / VISIBLE最接近。
视图不一定占用空间,如果不可见!
我制作了一个ComboBox-Alike,其上放置了一个ListView。 我只在select时才可见: