iOS:在加载叠加期间启用导航

时间:2016-07-15 13:49:50

标签: ios xamarin xamarin.ios frame cgrect

在我的xamarin iOS应用程序中,我有一个列表视图,我想在加载时显示加载图标。但是,我不想禁用整个页面。我希望用户仍然可以使用返回导航返回。

我使用this作为参考。

所以,我试图设置CGRect框架,让导航顶部处于活动状态,并在加载状态期间禁用页面的其余部分。

我正在使用这样的东西:new CGRect(30, 0,0, 0)从顶部留下30个单位,但它不起作用。任何人都可以帮我一个框架,只留下导航栏并覆盖页面的其余部分吗?

2 个答案:

答案 0 :(得分:1)

您必须将叠加层添加到表格视图中,这会导致出现居中问题。为此,有一些选项:滚动时重新计算叠加层的位置,在表格视图后面添加一个额外的图层,您可以使用autolayout进行定位,...

我正在使用自动布局,你应该避免给出实际数字,但也可以使用边界。还要注意用户是否导航,你必须取消任务!

答案 1 :(得分:1)

AutoLayout是一种比使用框架更好的完成此任务的方法。除非您需要定位真正的旧版iOS,否则AutoLayout通常就是您的选择。

我假设您使用的是UIViewController而不是UITableViewController。这是一个重要的区别,因为UITableViewController只允许您添加UITableView,这使得此任务更具挑战性。

将此AddAnOverlay方法添加到UIViewController课程,然后在想要显示叠加层时调用它。您可能需要将overlay放在实例变量中,以便以后可以将其删除。通过致电overlay.RemoveFromSuperview()将其删除即可。

    void AddAnOverlay()
    {
        var overlay = new UIView();
        overlay.BackgroundColor = UIColor.Black.ColorWithAlpha(0.45f); // or whatever colo
        overlay.TranslatesAutoresizingMaskIntoConstraints = false;

        var label = new UILabel();
        label.TranslatesAutoresizingMaskIntoConstraints = false;
        label.Text = "Loading Fantastic Things!";

        var spinner = new UIActivityIndicatorView();
        spinner.TranslatesAutoresizingMaskIntoConstraints = false;
        spinner.StartAnimating();

        overlay.AddSubview(spinner);
        overlay.AddConstraint(NSLayoutConstraint.Create(overlay, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, spinner, NSLayoutAttribute.CenterX, 1, 0));
        overlay.AddConstraint(NSLayoutConstraint.Create(overlay, NSLayoutAttribute.CenterY, NSLayoutRelation.Equal, spinner, NSLayoutAttribute.CenterY, 1, 0));

        overlay.AddSubview(label);
        // can adjust space between by changing -30 to whatever
        overlay.AddConstraint(NSLayoutConstraint.Create(spinner, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, label, NSLayoutAttribute.Top, 1, -30));
        overlay.AddConstraint(NSLayoutConstraint.Create(overlay, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, label, NSLayoutAttribute.CenterX, 1, 0));

        View.AddSubview(overlay);
        View.AddConstraint(NSLayoutConstraint.Create(TopLayoutGuide, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, overlay, NSLayoutAttribute.Top, 1, 0));
        View.AddConstraint(NSLayoutConstraint.Create(View, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, overlay, NSLayoutAttribute.CenterX, 1, 0));
        View.AddConstraint(NSLayoutConstraint.Create(View, NSLayoutAttribute.Width, NSLayoutRelation.Equal, overlay, NSLayoutAttribute.Width, 1, 0));
        View.AddConstraint(NSLayoutConstraint.Create(BottomLayoutGuide, NSLayoutAttribute.Top, NSLayoutRelation.Equal, overlay, NSLayoutAttribute.Bottom, 1, 0));
    }

请注意TopLayoutGuide中的BottomLayoutGuideNSLayoutConstraint。它们代表当前视图控制器的顶部和底部,因此它们可用于调整大小,以便它们不会隐藏导航栏,标签栏等。