我的Xamarin-iOS项目中的UIButton问题。我与伟大的MvvmCross和FluentLyout-Helpers合作(参见:FluentLyout)。但布局不是我的问题。
我将我的UIButton的隐藏属性设置为true。因此,我的视图中不再显示该按钮。但是按钮的空间仍然存在。
在下图中,您可以看到我的问题。在谷歌+和yammer按钮之间是一个Twitter按钮(隐藏)。但是太空还在那里。
我的布局代码:
// Set layout-constraints
View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
View.AddConstraints(
View.VerticalStackPanelConstraints(new Margins(10),
txtLabel, fbButton, msButton, goButton, twButton, yaButton));
每个按钮都以相同的方式创建:
var btn = UIButton.FromType(UIButtonType.System);
btn.SetTitle("title", UIControlState.Normal);
btn.Hidden = true;
Add(btn);
我该如何避免这种情况?任何帮助都会很棒。感谢
答案 0 :(得分:4)
正如您已经注意到的,隐藏的视图仍然存在。
我发现一个解决方案是在元素之间定义约束,并围绕需要隐藏的元素,但优先级较低。
然后,您可以使用RemoveFromSuperview()从布局中删除视图。使用已删除视图的约束将中断,您所做的其他约束将接管。
[编辑]
或者你可以让你的按钮成为tableview的一部分(并在tablesource中创建它们),然后你可以从tablesource中删除单个按钮并要求tableview更新。
[EDIT2]
更详细地解释第一个建议:
假设我们在视图组中有4个视图:| A B C D |。 我在这里假设水平方向,因为写帖子更容易,但你可以很容易地将它转换为垂直方向。原则是一样的。
通常我们只需要定义5个约束来将它们放在水平方向上。
| to A
A to B
B to C
C to D
D to |
现在,如果我们使用RemoveFromSuperview()删除B,我们也将破坏使用B的约束。结果是一个破坏的布局。
所以让我们给前五个约束优先级为1000.并指定更多。
| to B
A to C
B to D
C to |
让我们给他们一个较低的优先级900。 现在当我在B上调用RemoveFromSuperview()时,会发生以下情况:
A to B is broken
B to C is broken
A to C takes over
如果我想要,我也可以在D:
上调用RemoveFromSuperview()C to D is broken
D to | is broken
C to | takes over
如果我们希望能够删除两个连续的视图,我们需要指定:
| to C
A to D
B to |
这种方法确实有它的限制。
首先,当遇到10个视图时,它并没有真正有效地扩展。 当您希望能够删除3个或更多视图时,它也不会有效扩展。
但是在简单的情况下它确实有效,而对于其他情况,你可以将TableView与TableSource一起使用。