如何使用代码隐藏为使用 Xamarin 的自动布局设置不同的约束 iOS
How to use code behind to set different constraints for Auto Layout using Xamarin iOS
使用 Xamarin iOS 通过 C# 代码构建我的视图(没有设计器),我如何为不同的大小创建不同的约束集 类?
目前,我所做的只是仅使用代码创建约束,效果很好,但对于所有尺寸/方向,它都是同一组约束。
这段代码创建了两个自定义视图,并将它们设置为从左到右填满屏幕,并将它们一个放在另一个下面。这对于 iPhone 6+ 在纵向模式下非常有用,但在横向模式下我希望它隐藏第二个视图 (SomePanel) 并在整个屏幕上拉伸第一个视图 (MainPanel)。
partial class SomeView : MvxViewController
{
CustomView MainPanel;
CustomView SomePanel;
public SomeView (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
/// First Panel
MainPanel = CustomView.Create ();
View.AddSubview (MainPanel);
MainPanel.TranslatesAutoresizingMaskIntoConstraints = false;
/// Second Panel
SomePanel = CustomView.Create ();
View.AddSubview (SomePanel);
SomePanel.TranslatesAutoresizingMaskIntoConstraints = false;
/// <summary>
/// First set of constraints - two panels one under the other
/// </summary>
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, View, NSLayoutAttribute.CenterX, 1f, 0f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1f, 50f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, 60f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Width, NSLayoutRelation.Equal, 1f, View.Bounds.Width - 40));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, View, NSLayoutAttribute.CenterX, 1f, 0f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, MainPanel, NSLayoutAttribute.Bottom, 1f, 20f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, 60f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Width, NSLayoutRelation.Equal, 1f, View.Bounds.Width - 40));
}
}
我知道使用设计器很容易做到,设置约束,使用设计器更改大小 类 并再次从设计器编辑约束。
但在我的情况下,我想使用代码来完成,但我真的找不到关于如何为不同大小 类 / 不同方向设置不同约束集的指南或示例。
感谢任何帮助。
您必须通过检查屏幕宽度/高度/方向并相应地更新约束来手动执行此操作。
iOS 在使用故事板时会为您做到这一点。
顺便说一句,您可以使用 masonry nuget 或 fluentlayout nuget 以更简单的方式在代码中添加约束。
您可以覆盖 WillAnimateRotation
以检测方向已更改,只需在此处更新视图约束
public override void WillAnimateRotation (UIInterfaceOrientation toInterfaceOrientation, double duration)
{
base.WillAnimateRotation (toInterfaceOrientation, duration);
//Update view constraints...
}
另一个选项 正在管理 UpdateViewConstraints
上的所有视图,通常这会在加载 ViewController 时触发,但我们可以在每次定向时再次触发它已更改但更新 WillAnimateRotation
public override void WillAnimateRotation (UIInterfaceOrientation toInterfaceOrientation, double duration)
{
base.WillAnimateRotation (toInterfaceOrientation, duration);
View.SetNeedsUpdateConstraints ();
}
public override void UpdateViewConstraints ()
{
base.UpdateViewConstraints ();
var currentOrientation = InterfaceOrientation;
//Update view constraints with current orientation
}
使用 Xamarin iOS 通过 C# 代码构建我的视图(没有设计器),我如何为不同的大小创建不同的约束集 类?
目前,我所做的只是仅使用代码创建约束,效果很好,但对于所有尺寸/方向,它都是同一组约束。
这段代码创建了两个自定义视图,并将它们设置为从左到右填满屏幕,并将它们一个放在另一个下面。这对于 iPhone 6+ 在纵向模式下非常有用,但在横向模式下我希望它隐藏第二个视图 (SomePanel) 并在整个屏幕上拉伸第一个视图 (MainPanel)。
partial class SomeView : MvxViewController
{
CustomView MainPanel;
CustomView SomePanel;
public SomeView (IntPtr handle) : base (handle)
{
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
/// First Panel
MainPanel = CustomView.Create ();
View.AddSubview (MainPanel);
MainPanel.TranslatesAutoresizingMaskIntoConstraints = false;
/// Second Panel
SomePanel = CustomView.Create ();
View.AddSubview (SomePanel);
SomePanel.TranslatesAutoresizingMaskIntoConstraints = false;
/// <summary>
/// First set of constraints - two panels one under the other
/// </summary>
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, View, NSLayoutAttribute.CenterX, 1f, 0f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1f, 50f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, 60f));
View.AddConstraint (NSLayoutConstraint.Create (MainPanel, NSLayoutAttribute.Width, NSLayoutRelation.Equal, 1f, View.Bounds.Width - 40));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.CenterX, NSLayoutRelation.Equal, View, NSLayoutAttribute.CenterX, 1f, 0f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, MainPanel, NSLayoutAttribute.Bottom, 1f, 20f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, 60f));
View.AddConstraint (NSLayoutConstraint.Create (SomePanel, NSLayoutAttribute.Width, NSLayoutRelation.Equal, 1f, View.Bounds.Width - 40));
}
}
我知道使用设计器很容易做到,设置约束,使用设计器更改大小 类 并再次从设计器编辑约束。
但在我的情况下,我想使用代码来完成,但我真的找不到关于如何为不同大小 类 / 不同方向设置不同约束集的指南或示例。
感谢任何帮助。
您必须通过检查屏幕宽度/高度/方向并相应地更新约束来手动执行此操作。
iOS 在使用故事板时会为您做到这一点。
顺便说一句,您可以使用 masonry nuget 或 fluentlayout nuget 以更简单的方式在代码中添加约束。
您可以覆盖 WillAnimateRotation
以检测方向已更改,只需在此处更新视图约束
public override void WillAnimateRotation (UIInterfaceOrientation toInterfaceOrientation, double duration)
{
base.WillAnimateRotation (toInterfaceOrientation, duration);
//Update view constraints...
}
另一个选项 正在管理 UpdateViewConstraints
上的所有视图,通常这会在加载 ViewController 时触发,但我们可以在每次定向时再次触发它已更改但更新 WillAnimateRotation
public override void WillAnimateRotation (UIInterfaceOrientation toInterfaceOrientation, double duration)
{
base.WillAnimateRotation (toInterfaceOrientation, duration);
View.SetNeedsUpdateConstraints ();
}
public override void UpdateViewConstraints ()
{
base.UpdateViewConstraints ();
var currentOrientation = InterfaceOrientation;
//Update view constraints with current orientation
}