Лучшая практика для программного отображения UIView в правильной ориентации

Я создаю приложение monoTouch-iPad, и я спотыкаюсь из-за ориентации начального интерфейса.

Одна проблема заключается в том, что когда приложение запускается, UIDevice.CurrentDevice.Orientation всегда возвращает Unknown. Как вы можете решить, в какой ориентации запускается ваше приложение? Все свойства, которые я нашел на данный момент, просто возвращают портретный режим, неизвестный или размер кадра портретного режима - даже если это ландшафтный режим.

Я также создал два UIView (один для альбомной ориентации, другой для портретной ориентации) и уже изменил их в методе WillRotate UIViewController. Но мой код:

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

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

выдаёт короткое и некрасивое "мерцание" при повороте экрана - по крайней мере в симуляторе.

Есть ли наилучшая практика для размещения ваших просмотров? И я знаю о ShouldAutorotateToInterfaceOrientation, но это не работает для меня, так как я делаю много вещей, нарисованных владельцем, которые ломаются при автоматическом изменении размера (см. мой другой вопрос).

Я был бы очень признателен за решение без использования Interface-Builder, так как сейчас я делаю все в коде.

ОБНОВЛЕНИЕ: Краткое описание того, чего я хочу достичь: AppStart -> знание правильного размера кадра (1024 748 или 768 1004) -> Добавление собственного представления с правильным размером кадра

ОБНОВЛЕНИЕ 2: простой и простой фрагмент кода

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

возвращает портрет. Даже если симулятор находится в ландшафтном режиме.


person basti    schedule 02.03.2012    source источник


Ответы (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
    }
} 
person JeanLuc    schedule 02.03.2012
comment
Извините, но при запуске приложения this.InterfaceOrientation возвращает Portrait, даже если симулятор находится в ландшафтном режиме. - person basti; 02.03.2012
comment
Как правильно использовать AutoresizingMask с представлениями, нарисованными владельцем? И каковы преимущества переопределения LayoutSubviews? - person basti; 02.03.2012
comment
Я не могу работать с масками автоматического изменения размера, но как мне работать в LayoutSubviews? С преобразованиями или путем замены всего вида? - person basti; 02.03.2012
comment
вы можете делать все, что захотите: скрыть виды, установить рамку обзора, применить трансформацию, запустить анимацию - person JeanLuc; 02.03.2012