Мы решили, что при нажатии навигационной кнопки + на устройстве iPad будет запускаться метод performAddWithPopover:. Если мы имеем дело не с iPad, то нужно, чтобы при нажатии этой кнопки запускался метод performAddWithAlertView:. Итак, реализуем два этих метода, а также позаботимся о методах делегатов предупреждающего вида – чтобы нам было известно, какую кнопку в предупреждающем виде нажимает пользователь, работающий с iPhone:


>– (NSString *) photoButtonTitle{

>return @"Photo";

>}


>– (NSString *) audioButtonTitle{

>return @"Audio";

>}


>– (void) alertView:(UIAlertView *)alertView

>didDismissWithButtonIndex:(NSInteger)buttonIndex{


>NSString *buttonTitle = [alertView buttonTitleAtIndex: buttonIndex];


>if ([buttonTitle isEqualToString: [self photoButtonTitle]]){

>/* Добавляем фотографию… */

>}

>else if ([buttonTitle isEqualToString: [self audioButtonTitle]]){

>/* Добавляем аудио… */

>}


>}


>– (void) performAddWithAlertView:(id)paramSender{


>[[[UIAlertView alloc] initWithTitle: nil

>message:@"Add…"

>delegate: self

>cancelButtonTitle:@"Cancel"

>otherButtonTitles:

>[self photoButtonTitle],

>[self audioButtonTitle], nil] show];


>}


>– (void) performAddWithPopover:(id)paramSender{

>[self.popoverController

>presentPopoverFromBarButtonItem: self.barButtonAdd

>permittedArrowDirections: UIPopoverArrowDirectionAny

>animated: YES];


>}


Если запустить это приложение в эмуляторе iPad, то при нажатии кнопки + на навигационной панели мы увидим примерно такой интерфейс, как на рис. 1.79.


Рис. 1.79. Простой вспомогательный экран, отображаемый после нажатия навигационной кнопки


Если запустить это же универсальное приложение в эмуляторе iPhone и нажать на навигационной панели кнопку +, результат будет примерно как на рис. 1.80.


Рис. 1.80. В универсальном приложении вспомогательные экраны заменяются предупреждающими видами


Здесь мы воспользовались важным свойством контроллера информационного вида: preferredContentSize. Когда вспомогательный экран отображает контроллер своего информационного вида, он будет автоматически считывать значение этого свойства и корректировать свой размер (высоту и ширину). Кроме того, мы использовали метод presentPopoverFromBarButtonItem: permittedArrowDirections: animated: вспомогательного экрана в корневом контроллере нашего вида. Этот метод нужен, чтобы вспомогательный экран отображался над кнопкой навигационной панели. Первый параметр, принимаемый данным методом, – это кнопка навигационной панели, та, над которой должен всплывать контроллер вспомогательного экрана. Второй параметр указывает при появлении вспомогательного экрана направление его развертывания относительно объекта, из которого он появляется. Например, на рис. 1.79 видно, что стрелка вспомогательного экрана указывает вверх от кнопки с навигационной панели. Значение, передаваемое этому параметру, должно относиться к типу UIPopoverArrowDirection::


>typedef NS_OPTIONS(NSUInteger, UIPopoverArrowDirection) {

>UIPopoverArrowDirectionUp = 1UL << 0,

>UIPopoverArrowDirectionDown = 1UL << 1,

>UIPopoverArrowDirectionLeft = 1UL << 2,

>UIPopoverArrowDirectionRight = 1UL << 3,

>UIPopoverArrowDirectionAny = UIPopoverArrowDirectionUp |

>UIPopoverArrowDirectionDown |

>UIPopoverArrowDirectionLeft |

>UIPopoverArrowDirectionRight,

>UIPopoverArrowDirectionUnknown =

>NSUIntegerMax

>};

См. также

Разделы 1.9 и 1.15.

Глава 2. Создание динамических и интерактивных пользовательских интерфейсов

2.0. Введение

Когда iPhone только появился на рынке, он поистине задал стандарт интерактивности в мобильных приложениях. Приложения iOS были и остаются поразительно интерактивными – вы можете на ходу манипулировать различными компонентами пользовательского интерфейса, корректируя их для максимально полного удовлетворения своих потребностей.