iOS: 在加载覆盖时启用导航

iOS: Enable Navigation during loading overlay

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

我用了this作为参考。

所以,我正在尝试设置 CGRect 框架,使顶部的导航保持活动状态,并在加载状态期间禁用页面的其余部分。

我正在使用这样的方法:new CGRect(30, 0,0, 0) 从顶部留出 30 个单位,但它不起作用。谁能帮我制作一个框架,只留下导航栏并覆盖页面的其余部分?

您必须将叠加层添加到 table 视图,这会导致居中问题。为此,有一些选项:滚动时重新计算叠加层的位置,在 table 视图后面添加一个附加层,您使用自动布局引用该层进行定位,...

我正在使用自动版式,您应该避免给出实际数字,但也可以使用边界。还要注意,如果用户导航离开,您必须取消任务!

AutoLayout 是完成此任务的比使用框架更好的方法。除非您真的需要针对 iOS 的非常非常旧的版本,否则 AutoLayout 通常是可行的方法。

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

将此 AddAnOverlay 方法添加到您的 UIViewController class,然后在您想要显示叠加层时调用它。您可能需要将 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));
    }

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