Создание универсальных ViewControllers - PullRequest
0 голосов
/ 17 февраля 2011

Я нахожусь в процессе разработки универсального приложения для iOS.

Я хочу, чтобы все мои представления автоматически меняли размеры в зависимости от размера экрана, я имею в виду, что я не хочу жестко кодировать любые CGRectразмеры или использовать Interface Builder;Я использую конкретный пример приложения, но я был бы очень признателен за ответ, который можно использовать во многих похожих сценариях.

Это очень простое приложение, но я надеюсь, что ответ может показать мне, как это сделать длявсе мои взгляды, чтобы они могли адаптироваться к любому размеру.

Для этого конкретного приложения я создаю что-то, что будет выглядеть так:

A simple mockup of a screen used in my app.

Этоособенно хитрый пример, поскольку MKMapView нужно инициализировать с помощью фрейма, но я надеюсь, что вы мне поможете.

Первая проблема, с которой я столкнулся, заключалась в том, что в моем методе loadView:

MKMapView *mapView=[[MKMapView alloc ] initWithFrame:CGRectZero];

    mapView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

    self.view=mapView;

Маска авторазмера не работает, если контроллер представления не управляется UINavigationController;Я не знаю, почему.

Следующая проблема возникает, когда я хочу добавить свой UIToolbar внизу экрана.

Чтобы получить это, я делаю следующее:

UIToolbar *toolBar=[[UIToolbar alloc] initWithFrame:CGRectMake(0, 420, 320, 40)];

toolBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;

[self.view addSubview:toolBar];

Это прекрасно работает с iPhone, но не с iPad (ширина панели инструментов отрегулирована, но в нижней части экрана нет логера), поскольку размер жестко задан.

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

Скажите, пожалуйста, если мне не ясно.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Некоторые функции, определенные в CGGeometry, полезны при работе с геометрией представления iOS.

Скажем, вы хотели взять весь кадр и разделить на две части.Нижняя часть должна быть рамкой панели инструментов, которая расположена в нижней части экрана, и имеет высоту 44 пикселя.Оставшаяся часть сверху должна быть отдана на карту.Полезной функцией для этого является CGRectDivide, который определяется как:

void CGRectDivide (
   CGRect rect,
   CGRect *slice,
   CGRect *remainder,
   CGFloat amount,
   CGRectEdge edge
);

Вы передаете ему полный CGRect, два неинициализированных CGRect, которые будут заполнены правильными размерами кадра после разделения, ребро (слева), справа, сверху, снизу) с чего начать, и расстояние от этого края.

Играя с юникодом, это лучшее, что я могу сделать.Полный прямоугольник разделен на две части.Черные линии внизу - это рамка панели инструментов.Белые прямоугольники - это рамка, которую получает карта.

▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
CGRect appFrame = [[UIScreen mainScreen] applicationFrame];

CGRect mapFrame, toolbarFrame;
CGRectDivide(appFrame, &toolbarFrame, &mapFrame, 44, CGRectMaxYEdge);

// map is an MKMapView
map.frame = mapFrame;
// toolbar is a UIToolbar
toolbar.frame = toolbarFrame;

Вот как это выглядит на симуляторах iPhone и iPad.

enter image description here enter image description here

1 голос
/ 17 февраля 2011

Для панели инструментов вы можете обработать ее рамку так:

CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGRect toolbarFrame = CGRectMake(CGRectGetMinX(applicationFrame), CGRectGetMaxY(applicationFrame) - 44.0, applicationFrame.size.width, 44.0)
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame];

Если ваш UIToolbar не должен расширять ширину экрана, а вместо представления, просто установите applicationFrame на кадр этого представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...