обработка ориентации iphone/ipad

Это - больше общего вопроса для людей предоставить мне руководство на, в основном я изучаю разработку iPad/iPhone и наконец столкнулся с вопросом о поддержке мультиориентации.

Я искал изрядное количество doco, и моя книга "Начинающийся iPhone 3 Development" имеет хорошую главу по нему.

Но мой вопрос - это, если я должен был программно изменить свои средства управления (или даже использовать различные взгляды для каждой ориентации), как же людям поддерживают их кодовую базу? Я могу просто вообразить столько проблем с запутанным кодом / тысячами того, "если" бы проверки повсеместно, что он свел бы меня с ума для создания одного небольшого изменения расположения UI.

У кого-либо есть опыт при обработке этой проблемы? Что хороший путь состоит в том, чтобы управлять им?

Большое спасибо Mark

34
задан Mark 12 May 2010 в 02:26
поделиться

3 ответа

Я делаю это двумя простыми методами в моем контроллере представления:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self adjustViewsForOrientation:toInterfaceOrientation];
}

- (void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
        titleImageView.center = CGPointMake(235.0f, 42.0f);
        subtitleImageView.center = CGPointMake(355.0f, 70.0f);
        ...
    }
    else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
        titleImageView.center = CGPointMake(160.0f, 52.0f);
        subtitleImageView.center = CGPointMake(275.0f, 80.0f);
        ...
    }
}

Чтобы сохранить это чистым, вы можете легко разделить настройки / перезагрузку представления / и т. Д. с методами, вызываемыми из единственного условного if-else .

41
ответ дан 27 November 2019 в 16:58
поделиться

iPhone SDK построен на основе архитектуры MVC, поэтому теоретически, если вы сохраните всю свою логику (модель) отдельно от пользовательского интерфейса (представления), тогда вы придется беспокоиться только об одном месте пользовательского интерфейса: контроллерах представления. Для них у вас может быть отдельный контроллер представления для каждой ориентации, каждая из которых затем будет просто загружена одним if / else, чтобы выбрать, какой контроллер представления загружать.

Та же идея применима к поддержке iPhone / iPad, где вы можете загрузить другой контроллер представления, который может обрабатывать большие дисплеи.

2
ответ дан 27 November 2019 в 16:58
поделиться

Это действительно зависит от того, что именно вы выкладываете.

Если вы посмотрите на приложение Apple Settings, вы увидите, что они используют табличные представления для компоновки, с пользовательскими ячейками для большинства строк. Благодаря этому вы можете позволить простому интерфейсу вращаться довольно дешево, просто заполнив ширину ячеек. Это применимо даже к таким вещам, как Mail, где в каждой строке есть ячейки для редактирования текста. А таблицы легко могут быть полностью прозрачными, с видимыми только кнопками или ярлыками, так что они не выглядят как таблицы.

Вы можете извлечь много пользы из autoresizingMask каждого UIView. Если у вас есть один или несколько элементов, которые могут иметь гибкую высоту, то обычно вы можете получить макет интерфейса, который хорошо выглядит в любой ориентации. В зависимости от того, как это выглядит, иногда можно просто прикрепить все к вершине.

В редких случаях, если все элементы интерфейса помещаются в квадрат, можно просто повернуть их на месте.

Есть два случая, когда необходимо явно обрабатывать изменения ориентации. Один из них - когда при повороте представление перемещается из положения рядом с другим в положение под ним. Другой - когда у вас есть разные изображения для каждой ориентации, например, если вы хотите, чтобы изображение всегда было во всю ширину.

Иногда есть способы обойти обе эти проблемы. Вы можете использовать растягивающиеся изображения или ограничиться одним видом в строке. Или вы можете заблокировать ориентацию для определенных видов.

Если вам необходимо изменить расположение представлений, существует явный метод layoutSubviews. Вы должны стараться обрабатывать все условные компоновки в этом методе. Он вызывается только при изменении границ представления, например, при повороте или если вы освободили место для клавиатуры. Создайте пользовательское представление для каждой иерархии представлений, которая должна реагировать на поворот, и компонуйте вложенные представления оттуда.

7
ответ дан 27 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: