以正确方向以编程方式显示 UIView 的最佳实践

Posted

技术标签:

【中文标题】以正确方向以编程方式显示 UIView 的最佳实践【英文标题】:Best practice for programmatically showing UIView in correct orientation 【发布时间】:2012-03-02 10:22:12 【问题描述】:

我正在构建一个 monoTouch-iPad 应用程序,但由于面向启动界面,我一直在磕磕绊绊。

一个问题是,当应用程序启动时UIDevice.CurrentDevice.Orientation 总是返回Unknown。你如何决定你的应用程序从哪个方向开始?我现在找到的所有属性都只返回纵向模式、未知或纵向模式的帧大小——即使它是横向模式。

我还创建了两个 UIView(一个用于横向,一个用于纵向)并在 UIViewController 的 WillRotate 方法中更改它们。但我的代码:

if(toInterfaceOrientation==UIInterfaceOrientation.LandscapeLeft || toInterfaceOrientation==UIInterfaceOrientation.LandscapeRight)

        _scrollView.RemoveFromSuperview();
        this.View.Add (_scrollViewLandscape);
        else
        _scrollViewLandscape.RemoveFromSuperview();
        this.View.Add (_scrollView);

在旋转屏幕时会产生短暂而难看的“闪烁” - 至少在模拟器中是这样。

是否有布置视图的最佳做法?而且我知道ShouldAutorotateToInterfaceOrientation但这对我不起作用,因为我正在做很多所有者绘制的东西,当自动调整大小时会损坏(see my other question)。

我非常感谢不使用 Interface-Builder 的解决方案,因为我现在正在用代码做所有事情。

更新:简短描述我想要实现的目标: AppStart -> 知道正确的帧大小(1024,748 或 768,1004) -> 以正确的帧大小添加我的自定义视图

UPDATE2:简单基本的代码-sn-p

public override void ViewDidLoad ()
    
        base.ViewDidLoad ();            
        Console.WriteLine (this.InterfaceOrientation);
    

返回纵向。即使模拟器处于横向模式。

【问题讨论】:

【参考方案1】:

在你的 UIViewController 里面可以检查 InterfaceOrientation

public override void ViewDidLoad ()

    if (this.InterfaceOrientation == UIInterfaceOrientation.Portrait
        || this.InterfaceOrientation == UIInterfaceOrientation.PortraitUpsideDown)
    
        // portrait
    
    else
    
        // landsacpe
    

但我真的建议使用 View.AutoresizingMask 或覆盖 LayoutSubviews,两者都可以使所有过渡都非常流畅

更新:使用 AutoresizingMask

public override void ViewDidLoad ()

    UIView view = new CustomView(View.Bounds);
    view.AutoresizingMask = UIViewAutoresizing.FlexibleHeight |  UIViewAutoresizing.FlexibleWidth;
    View.AddSubview(view);

更新:覆盖 LayoutSubviews

每次大小改变时都会调用LayoutSubviews

public class CustomView : UIView

    public override void LayoutSubviews ()
    
        //layout your view with your own logic using the new values of Bounds.Width and Bounds.Height
    
 

【讨论】:

抱歉,即使模拟器处于横向模式,应用程序启动时this.InterfaceOrientation 也会返回Portrait 如何正确使用带有自绘视图的 AutoresizingMask?覆盖 LayoutSubviews 有什么好处? 我无法使用 Autoresizing Masks 进行我想要的工作,但我应该如何在 LayoutSubviews 中工作?使用转换还是替换整个视图? 你可以做任何你想做的事:隐藏视图、设置视图框架、应用变换、启动动画

以上是关于以正确方向以编程方式显示 UIView 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建 UIView 和 UIViewController 并链接在一起的正确方法

在 SwiftUI 中以编程方式移动 NavigationView 的最佳实践是啥

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

Spritesheet 以编程方式切割:最佳实践

没有帖子时以编程方式显示 UIView

UIView 未以编程方式显示在 UIScrollView 中