#ios #xcode #uipageviewcontroller
#iOS #xcode #uipageviewcontroller
Вопрос:
Я искал учебные пособия по настройке UIPageViewController, потому что кто-то рекомендовал не использовать мой навигационный контроллер, а вместо этого использовать просмотр страницы. Я также использую жест салфетки влево и вправо, но мне еще предстоит найти хороший онлайн-учебник по настройке UIPageViewController через раскадровку (или, по крайней мере, основную раскадровку).
Я включил изображение того, с чем я работаю в данный момент: http://imgur.com/a0iuFNW
Любая помощь в отношении настройки pageViewController, а затем следующих контроллеров будет высоко оценена!
Благодарим вас за помощь в расширенном
Ответ №1:
Я уверен, что вы можете найти несколько руководств, если Загуглите, но это должно дать вам возможность попробовать свою собственную реализацию. Я создал новый проект, начиная с шаблона «Приложение на основе страницы». Вы должны изучить код, который позволяет вам попытаться понять, что он делает (наряду с чтением документации Apple по UIPageViewController).
Этот проект создает несколько объектов. RootViewController создает контроллер просмотра страницы и добавляет его в качестве дочернего контроллера просмотра. Для моего тестового приложения я ничего не менял в этом файле, кроме изменения стиля перехода контроллера просмотра страницы на UIPageViewControllerTransitionStyleScroll (вместо page curl, но вы также должны попробовать исходное значение, чтобы увидеть, как оно выглядит).
Класс ModelController содержит модель, которая в вашем случае будет представлять собой массив имен изображений (или фрагментов имени, как у меня). Этот класс реализует методы источника данных контроллера просмотра страницы, которые обрабатывают перелистывание страниц. Я изменил метод init в этом классе на этот,
- (id)init {
if (self = [super init]) {
_pageData = @[@"1", @"2", @"3", @"4", @"5", @"6"]; // my images are named img1.JPG, img2.JPG, etc. I will use these numbers to construct the path to my files in the bundle
}
return self;
}
Итак, вы можете видеть, что модель представляет собой просто массив числовых строк (по одному числу для каждого изображения). Возможно, вам придется попробовать что-то другое в зависимости от того, как называются ваши изображения. Когда вы проводите пальцем между страницами, индекс в этом массиве либо увеличивается, либо уменьшается, а значение в массиве передается DataViewController в его свойство DataObject.
DataViewController — это контроллер, который фактически показывает ваш контент. Это правильный контроллер в раскадровке. Я изменил его представление, добавив панель навигации вверху, чтобы мы могли вставить заголовок и кнопку (чтобы перейти к вашим подсказкам контроллеров просмотра), и заменил подвиды UIView на UIImageView, который занимает весь экран под панелью навигации. Я создал IBOutlets для просмотра изображений и панели навигации. Вот измененный файл .h для этого контроллера,
@interface DataViewController : UIViewController
@property (strong, nonatomic) NSString *dataObject;
Наконец, в файле .m я сделал так, чтобы это выглядело так,
@interface DataViewController ()
@property (weak,nonatomic) IBOutlet UINavigationBar *bar;
@property (weak,nonatomic) IBOutlet UIImageView *iv;
@end
@implementation DataViewController
- (void)viewDidLoad{
[super viewDidLoad];
UINavigationItem *titleItem = self.bar.items[0];
titleItem.title = [NSString stringWithFormat:@"Course Guide %@",self.dataObject];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"img%@", self.dataObject] ofType:@"JPG"];
self.iv.image = [UIImage imageWithContentsOfFile:imagePath];
}
-(void)dealloc {
NSLog(@"in dealloc");
}
Я использую initWithContentsOfFile: для создания изображений (а не imageNamed: потому что он не кэширует изображения) на основе числа, переданного в DataObject . Я реализовал dealloc, чтобы проиллюстрировать тот факт, что при пролистывании страниц вперед и назад контроллеры освобождаются, что позволяет уменьшить объем памяти. Если стиль перехода — page curl, контроллеры освобождаются, как только они исчезают с экрана, поэтому одновременно никогда не существует более одного. Если стиль — прокрутка, то одновременно существует 3, потому что контроллер просмотра страницы создает текущий, а также предыдущий и следующий, чтобы ускорить загрузку.
Как вы можете видеть, я внес лишь несколько небольших изменений в код, который предоставляет вам шаблон, чтобы отобразить массив изображений, который должен соответствовать вашим целям. Такая структура для вашего приложения будет намного эффективнее использовать память, чем использование стека контроллеров в навигационном контроллере.
Комментарии:
1. Спасибо за ваш подробный ответ. Очень признателен. В вашем «тестовом приложении» вы создали два класса Objective-C с именем: DataViewController (подкласс UIViewController), а другой с именем ModelViewController (также подкласс UIViewController)? Я понимаю большую часть кода, за исключением мест, в которые его нужно поместить. Например, вы упоминаете метод init. Должен ли метод init использоваться в viewcontroller.m по умолчанию или в одном из новых классов, которые вы упомянули? То же самое относится и к последним двум блокам кода.
2. @user3743364, я не создавал никаких новых классов, все объекты уже созданы в шаблоне. Если вы посмотрите на абзац прямо над этим первым блоком кода, в нем указано, что код находится в ModelController. Что касается другого кода, вы можете увидеть имя класса DataViewController прямо в коде. Я использовал Xcode 5.1 для создания этого приложения, и весь код, за исключением моих незначительных изменений, находится в шаблоне.
3. Я воссоздал каждый фрагмент кода, поместив инициализацию (id) в шаблон viewcontroller.m по умолчанию, второй блок кода в viewcontroller.h, как уже упоминалось, и последний, опять же, в viewcontroller.m . Я подключил панель навигации и вид изображения сверху с помощью IBOutlet, и все, казалось, пошло. Xcode говорит: «Использование необъявленного идентификатора «_pageData», и я не совсем уверен, как это исправить: imgur.com/3QLrj8v Кроме того, если мои изображения имеют имена (скажем) golf1.png, golf2.png, golf3.png и т.д… Как бы мне внедрить эти имена в файл .m, как вы это делали с помощью @»1″, @»2″и т. Д
4. @user3743364 с какого шаблона вы начинаете и какую версию Xcode вы используете? Это не те классы.
5. Я использую Xcode 5.1.1 и использую приложение single view с раскадровкой