Как переключать представления с помощью скручивания страницы с UIPageViewController в Xcode 4.2

#xcode

#xcode

Вопрос:

Я хочу создать приложение для iPhone, но теперь мне нужно, как вы можете переключать просмотры, переворачивая страницу, как iBooks в книге, я видел в Интернете, что с помощью UIPageViewController вы можете сделать это в Xcode 4.2 на iOS 5,

Спасибо, Гарри

Ответ №1:

Создайте новый проект типа Single View Application, назовите его BookEffect, снимите флажок Использовать раскадровки, снимите флажок Включать модульные тесты, но обязательно установите флажок Использовать автоматический подсчет ссылок.

Затем добавьте в проект несколько изображений, например, в формате JPEG.

Создайте новый файл — используйте шаблон класса Objective-C с подклассом UIViewController, выберите опцию с XIB для пользовательского интерфейса и назовите его SinglePageViewController. Сохраните файл в папке BookEffect.

После добавления выберите SinglePageViewController.xib и добавьте в представление элементы управления UILabel и UIImageView и установите соответствующие подключения к владельцу файла.

Измените SinglePageViewController.h, чтобы он выглядел следующим образом:

 #import <UIKit/UIKit.h>
@interface SinglePageViewController : UIViewController
{
    NSUInteger pageNumber;
}
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
@property (nonatomic, assign) NSUInteger pageNumber;
- (void) setPageNumber: (NSUInteger) newPageNumber;
- (NSUInteger) pageNumber;
@end
  

В SinglePageViewController.m добавить:

 @synthesize imageView, titleLabel;
  

и добавьте эти определения методов:

 - (void) setPageNumber: (NSUInteger) newPageNumber{
    pageNumber = newPageNumber;
}
- (NSUInteger) pageNumber{
    return pageNumber;
}
- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    [titleLabel setText:[NSString stringWithFormat:@"Page %d", pageNumber]];
    NSArray *images = [[NSBundle mainBundle] pathsForResourcesOfType:@".jpg" inDirectory:nil];
    UIImage *img = [UIImage imageWithContentsOfFile:[images objectAtIndex:pageNumber-1]];
    [imageView setImage:img];
}
  

Теперь перейдите к BookEffecViewController.h и сделайте так, чтобы это выглядело так:

 #import <UIKit/UIKit.h>
#import "SinglePageViewController.h"
@interface BookEffectViewController : UIViewController 
<UIPageViewControllerDataSource>
@property( nonatomic, strong) UIPageViewController *pageViewController;
@end
  

В BookEffectViewController.m измените viewDidLoad, чтобы он выглядел следующим образом:

 - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    self.pageViewController.dataSource = self;
    SinglePageViewController *singlePage = [[SinglePageViewController alloc]  initWithNibName:@"SinglePageViewController" bundle:nil];
    [singlePage setPageNumber:1];
    NSArray *controllers = [[NSArray alloc] initWithObjects:singlePage, nil];
    [self.pageViewController setViewControllers:controllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    [self addChildViewController:self.pageViewController];
    [self.view addSubview:self.pageViewController.view];
    self.pageViewController.view.frame = self.view.bounds;
}
  

Определите еще два метода в BookEffectViewController.m:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger previousPageNumber = [((SinglePageViewController*)viewController) pageNumber];
    if ( previousPageNumber == 1 ) {
        return nil;
    }
    else{
        SinglePageViewController *singlePage = [[SinglePageViewController alloc] initWithNibName:@"SinglePageViewController" bundle:nil];
        [singlePage setPageNumber:previousPageNumber-1];
        return singlePage;
    }
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger previousPageNumber = [((SinglePageViewController*)viewController) pageNumber];
    if ( previousPageNumber >= [[[NSBundle mainBundle] pathsForResourcesOfType:@".jpg" inDirectory:nil] count] ) {
        return nil;
     }
    else{
        SinglePageViewController *singlePage = [[SinglePageViewController alloc] initWithNibName:@"SinglePageViewController" bundle:nil];
         [singlePage setPageNumber:previousPageNumber 1];
        return singlePage;
    }
}
  

Вот и все. Команда-R для тестирования с помощью симулятора iPad
Это базовая оболочка, и другие навороты могут быть добавлены для вашего собственного удовольствия, т. Е. удалить номер страницы, добавить заголовок и т.д.

Надеюсь, это помогло.

Ответ №2:

Начните с шаблона проекта на основе просмотра страниц в Xcode и взгляните на setViewControllers:direction:animated:completion: метод.

Комментарии:

1. Привет, Роб, я новичок в разработке приложений, поэтому не могли бы вы рассказать об этом более подробно? Спасибо