Лучшая практика для программного показа UIView в правильной ориентации - PullRequest
2 голосов
/ 02 марта 2012

Я создаю приложение monoTouch-iPad и спотыкаюсь из-за ориентации start-interface.

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

Я также создал два UIViews (один для пейзажа, один для портрета) иизменив их сейчас в 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) -> добавление моего пользовательского представления в правильном размере кадра

UPDATE2: простой и базовый фрагмент кода

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

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

1 Ответ

3 голосов
/ 02 марта 2012

внутри вашего 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
    }
} 
...