Xamarin iOS UIButton隐藏/显示

时间:2014-08-21 13:07:56

标签: ios uibutton xamarin visibility mvvmcross

我的Xamarin-iOS项目中的UIButton问题。我与伟大的MvvmCross和FluentLyout-Helpers合作(参见:FluentLyout)。但布局不是我的问题。

我将我的UIButton的隐藏属性设置为true。因此,我的视图中不再显示该按钮。但是按钮的空间仍然存在。

在下图中,您可以看到我的问题。在谷歌+和yammer按钮之间是一个Twitter按钮(隐藏)。但是太空还在那里。

hidden problem

我的布局代码:

// 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);

我该如何避免这种情况?任何帮助都会很棒。感谢

1 个答案:

答案 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一起使用。