Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

Постановка задачи

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

Решение

Воспользуйтесь свойством viewControllers из класса UINavigationController для доступа к массиву контроллеров видов, связанных с навигационным контроллером, а также для изменения этого массива:

— (void) goBack{

/* Получаем актуальный массив контроллеров видов. */

NSArray *currentControllers = self.navigationController.viewControllers;

/* Создаем
на основе этого массива изменяемый массив. */

NSMutableArray *newControllers = [NSMutableArray

arrayWithArray: currentControllers];

/* Удаляем последний объект из массива. */

[newControllers removeLastObject];

/* Присваиваем этот массив навигационному контроллеру. */

self.navigationController.viewControllers = newControllers

}

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

Обсуждение

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

Если мы напрямую управляем контроллерами видов, связанными с навигационным контроллером, то есть путем присвоения массива свойству viewControllers навигационного контроллера, то весь процесс будет протекать без явного перехода между контроллерами и без анимации. Если вы хотите, чтобы эти действия анимировались, используйте метод setViewControllers: animated:, относящийся к классу UINavigationController, как показано в следующем фрагменте кода:

— (void) goBack{

/* Получаем актуальный массив контроллеров видов. */

NSArray *currentControllers = self.navigationController.viewControllers;

/* Создаем на основе этого массива изменяемый массив. */

NSMutableArray *newControllers = [NSMutableArray

arrayWithArray: currentControllers];

/* Удаляем последний объект из массива. */

[newControllers removeLastObject];

/* Присваиваем этот массив навигационному контроллеру. */

[self.navigationController setViewControllers: newControllers

animated: YES];

}

1.14. Демонстрация изображения на навигационной панели

Постановка задачи

В качестве заголовка контроллера вида, ассоциированного в данный момент с навигационным контроллером, требуется отобразить не текст, а изображение.

Решение

Воспользуйтесь свойством titleView навигационного элемента контроллера вида:

— (void)viewDidLoad{

[super viewDidLoad];

/* Создаем
вид с изображением, заменяя им вид с заголовком. */

UIImageView *imageView =

[[UIImageView alloc]

initWithFrame: CGRectMake(0.0f, 0.0f, 100.0f, 40.0f)];

imageView.contentMode = UIViewContentModeScaleAspectFit;

/* Загружаем изображение. Внимание! Оно будет кэшироваться. */

UIImage *image = [UIImage imageNamed@"Logo"];

/* Задаем картинку для вида с изображением. */

[imageView setImage: image];

/* Задаем вид с заголовком. */

self.navigationItem.titleView = imageView;

}

Предыдущий код должен выполняться в контроллере вида, находящемся внутри навигационного контроллера.

Я уже загрузил изображение в группу ресурсов моего проекта и назвал это изображение Logo. Как только вы запустите это приложение с приведенным фрагментом кода, увидите результат, напоминающий рис. 1.35.

Рис. 1.35. Вид с изображением на нашей навигационной панели

Обсуждение

Навигационный элемент каждого конкретного контроллера вида может отображать два различных вида контента в той области контроллера вида, которой этот элемент присвоен:

• обычный текст;

• вид.

Если вы собираетесь работать с текстом, можете использовать свойство title навигационного элемента. Тем не менее, если вам требуется более полный контроль над заголовком или вы просто хотите вывести над навигационной панелью изображение или любой другой вид, можете использовать свойство titleView навигационного элемента контроллера вида. Ему можно присваивать любой объект, являющийся подклассом класса UIView. В примере мы создали вид для изображения, а затем присвоили ему изображение. Потом вывели это изображение в качестве заголовка вида, в настоящий момент находящегося на навигационном контроллере.

Свойство titleView навигационной панели — это самый обычный вид, но Apple рекомендует, чтобы его высота не превышала 128 точек. Поэтому считайте его изображением. Если бы вы загружали изображение, имеющее высоту 128 пикселов, то на сетчатом дисплее это соответствовало бы 64 точкам и все было бы нормально. Но если бы вы загружали изображение высотой 300 пикселов на сетчатом дисплее, то по высоте оно заняло бы 150 точек, то есть заметно превысило бы те 128 точек, которые Apple рекомендует для видов, расположенных в строке заголовка. Для исправления этой ситуации необходимо гарантировать, что вид в строке заголовка по высоте ни в коем случае не окажется больше 128 точек, а также задать для контента режим заполнения вида целиком, а не подгонки вида под содержимое. Для этого можно установить свойство contentMode вашей строки заголовка в UIViewContentModeScaleAspectFit.

Поделиться:
Популярные книги

111 симфоний

Михеева Людмила Викентьевна
Справочная литература:
справочники
6.00
рейтинг книги
111 симфоний

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.40
рейтинг книги
Гримуар темного лорда VII

Акелдама - кровавое поле битвы. Книга 3. Часть 2

Вихрева Елена
3. Акелдама - кровавое поле битвы
Фантастика:
фэнтези
8.00
рейтинг книги
Акелдама - кровавое поле битвы. Книга 3. Часть 2

Первый контакт (сборник)

Лем Станислав
Фантастика:
научная фантастика
5.00
рейтинг книги
Первый контакт (сборник)

Яд вожделения

Арсеньева Елена
Любовные романы:
исторические любовные романы
7.62
рейтинг книги
Яд вожделения

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
6.25
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Сказки. Истории

Андерсен Ганс Христиан
66. Библиотека всемирной литературы
Проза:
классическая проза
7.38
рейтинг книги
Сказки. Истории

Санкт-Петербург. Автобиография

Королев Кирилл Михайлович
Научно-образовательная:
история
5.00
рейтинг книги
Санкт-Петербург. Автобиография

Маурайская федерация (сборник)

Андерсон Пол Уильям
Фантастика:
научная фантастика
5.00
рейтинг книги
Маурайская федерация (сборник)

Матрица жизни на Земле. Том 4

Мулдашев Эрнст Рифгатович
4. В поисках города богов
Юмор:
юмористическая проза
6.25
рейтинг книги
Матрица жизни на Земле. Том 4

Князь Андер Арес 2

Грехов Тимофей
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.40
рейтинг книги
Князь Андер Арес 2

Россия и Китай. Конфликты и сотрудничество

Широкорад Александр Борисович
Военные тайны XX века
Научно-образовательная:
история
5.00
рейтинг книги
Россия и Китай. Конфликты и сотрудничество

Мрачные сны воров

Инин Дмитрий
5. Негодяй Аллара
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Мрачные сны воров