Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用代码隐藏为使用Xamarin iOS的自动布局设置不同的约束_C#_Xamarin_Autolayout_Constraints_Size Classes - Fatal编程技术网

C# 如何使用代码隐藏为使用Xamarin iOS的自动布局设置不同的约束

C# 如何使用代码隐藏为使用Xamarin iOS的自动布局设置不同的约束,c#,xamarin,autolayout,constraints,size-classes,C#,Xamarin,Autolayout,Constraints,Size Classes,使用Xamarin iOS构建带有C#代码隐藏的视图(没有设计器),如何为不同大小的类创建不同的约束集 现在,我所能做的就是仅使用代码创建约束,虽然效果很好,但对于所有大小/方向都是相同的约束集 这段代码创建了两个自定义视图,并将它们设置为从左到右填充屏幕,然后将它们一个放置在另一个下面。这对于iPhone 6+在纵向模式下非常好,但在横向模式下,我希望它隐藏第二个视图(SomePanel),并将第一个视图(MainPanel)拉伸到整个屏幕 partial class SomeView :

使用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));

    }

}
部分类SomeView:MvxViewController
{
自定义视图主面板;
自定义视图面板;
公共SomeView(IntPtr句柄):基本(句柄)
{
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
///第一小组
MainPanel=CustomView.Create();
View.AddSubview(主面板);
MainPanel.translatesAutoResizezingMaskintoConstraints=false;
///第二小组
SomePanel=CustomView.Create();
View.AddSubview(SomePanel);
SomePanel.TranslatesAutoresizingMaskIntoConstraints=false;
/// 
///第一组约束-两个面板,一个在另一个下面
/// 
View.AddConstraint(NSLayoutConstraint.Create(主面板,NSLayoutAttribute.CenterX,NSLayoutRelation.Equal,视图,NSLayoutAttribute.CenterX,1f,0f));
View.AddConstraint(NSLayoutConstraint.Create(主面板,NSLayoutAttribute.Top,NSLayoutRelation.Equal,视图,NSLayoutAttribute.Top,1f,50f));
View.AddConstraint(NSLayoutConstraint.Create(主面板,NSLayoutAttribute.Height,NSLayoutRelation.Equal,1f,60f));
View.AddConstraint(NSLayoutConstraint.Create(主面板,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会帮你做到这一点


顺便说一句,您可以使用砌体nuget或fluentlayout nuget以更简单的方式在代码中添加约束。

您必须通过检查屏幕宽度/高度/方向并相应地更新约束来手动执行此操作

当你使用故事板时,iOS会帮你做到这一点


顺便说一句,您可以使用砌体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
    }

您可以覆盖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
    }

有一种方法可以替代,当方向改变时触发,在其中设置视图。有一种方法可以替代,当方向改变时触发,在其中设置视图。