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
中的 TopLayoutGuide
和 BottomLayoutGuide
。它们代表当前视图控制器的顶部和底部,因此它们可用于调整大小,因此它们不会隐藏导航栏、标签栏等。
在我的 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
中的 TopLayoutGuide
和 BottomLayoutGuide
。它们代表当前视图控制器的顶部和底部,因此它们可用于调整大小,因此它们不会隐藏导航栏、标签栏等。