ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 2

Анимация перехода

 

Недавно мы узнали как использовать промежуточную анимацию, а для закрепления знаний я предлагаю разобраться в работе анимации переходов. Делать мы это будем на примере листания страниц. То есть, напишем что-то вроде книги, в которой реализцем реалистичный эффект переворачивания страницы. В первую очередь создадим сам проект на основе шаблона Single View Application и назовем его AnimationTransition. Измените в нем файл интерфейса так, как это показано на первой картинке (ща исключением анимации).

 

Теперь перейдем непосредственно к программированию:

ViewController.h

<code data-result="[object Object]">#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController {
    NSInteger currentIndex;
}

@property (strong, nonatomic) IBOutlet UILabel *content;
@property (strong, nonatomic) NSArray *dataSource;

- (IBAction)next;
- (IBAction)previous;

@end</code>

 

В основном добавленый код нужен для связи с интерфейсом. За исключением dataSource, в котором будет храниться текст для надписи content и currentIndex, в котором мы будем хранить текущий индекс надписи на экране. Действия next и previous необходимы для будущего перелистывания страниц. Свяжите созданные объекты с интерфейсом.

 

ViewController.m

 

<code data-result="[object Object]">#import "ViewController.h"

@implementation ViewController

@synthesize content;
@synthesize dataSource;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.content = nil;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    currentIndex = 0;
    self.dataSource = [NSArray arrayWithObjects:
                       @"Objective C", 
                       @"C",
                       @"C++",
                       @"Java",
                       @"Pascal",
                       @"Delphi", nil];

    content.text = [dataSource objectAtIndex:currentIndex];
}

- (IBAction)next {
    if (currentIndex &lt; dataSource.count-1) {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.25];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp 
                               forView:self.view 
                                 cache:NO];
        [UIView commitAnimations];

        currentIndex++;
        content.text = [dataSource objectAtIndex:currentIndex];
    }
}

- (IBAction)previous {
    if (currentIndex &gt; 0) {
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:1.25];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown 
                               forView:self.view 
                                 cache:NO];
        [UIView commitAnimations];

        currentIndex--;
        content.text = [dataSource objectAtIndex:currentIndex];
    }
}

@end</code>

 

Разберем по порядку как это работает. В первую очередь, мы синтезированил методы доступа для объектов content и dataSource, затем организовали очистку памяти от объекта content в случае выгрузки основного представления. В методе viewDidLoad мы задаем начальное значение переменной currentIndex, инициализируем массив dataSource и устанавливаем надписи content значение первого элемента этого массива. Но все это была лишь подготовка. Вся анимация выполняется в методах — (IBAction)next и — (IBAction)previous. Следующие строки вам наверное уже знакомы с урока Промежуточная анимация в iOS

 

<code data-result="[object Object]">[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView commitAnimations];</code>

 

Но в прошлый раз перед строкой [UIView commitAnimations]; мы задавали новое значение какому-то из объектов интерфейса. Но в этот раз мы заменили установку новых значений методом setAnimationTransition. В него мы передаем три параметра: тип перехода, объект интерфейса к которому будут применен переход и метку кеширования (хотим мы кешировать данную анимацию или нет). После начала анимации мы увеличиваем (или уменьшаем) значение currentIndex на еденицу и меняем текст в надписи content. Чтобы при перелистывании мы не пытались получить текст с массива за его границами — я добавил условный оператор, который сравнивает значение переменной currentIndex с размером массива.

 

В этом примере мы рассмотрели два типа переходов, но всего их больше:

 

  • UIViewAnimationTransitionNone
  • UIViewAnimationTransitionFlipFromLeft
  • UIViewAnimationTransitionFlipFromRight
  • UIViewAnimationTransitionCurlUp
  • UIViewAnimationTransitionCurlDown

 

Можете поэкспериментировать с ними на данном примере.