如何使用代码隐藏为使用 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
    }