12 April 2010

Создание полосы прокрутки картинок а-ля iPhoto. Часть 2

Development for iOS
Translation
Original author: MLS-Automatization
В предыдущей части мы создали в общем-то страшненькую полосу прокрутки, которая, к тому же, некорректно работает с контентом, превыщающим её ширину да и не откликается на повороты девайса.
Сегодня мы постараемся исправить данные недостатки.

Удалим ImageScrubberToolbarDelegate из протоколов ImageScrubberAppDelegate и реализацию метода -(void)imageSelected:(int) anIndex и добавим поле ImageScrubberViewController *viewController.

Теперь создадим новый документ InterfaceBuilder, выберем ImageScrubberViewController в роли file’s owner, добавим UIView и ImageScrubberToolbar как дочерний элемент UIView.

Теперь выберем команду “Write class files” добавим поле IBOutlet ImageScrubberToolbar *imageScrubberToolbar в класс ImageScrubberViewController, добавим ImageScrubberToolbarDelegate в протоколы ImageScrubberViewController добавим реализацию метода -(void)imageSelected:(int) anIndex.

Теперь, реализуем метод -(void)viewDidLoad класса ImageScrubberViewController.

[super viewDidLoad];

NSString * resourcePath = [[NSBundle mainBundle] resourcePath];


NSArray * imagesArray = [NSArray arrayWithObjects: [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Aurora.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Gentle Rapids.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Ladybug.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Pond Reeds.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Rock Garden.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Rocks.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Snow Leopard Prowl.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Snow Leopard.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Snowy Hills.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Stones.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Summit.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Tahoe.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Tranquil Surface.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Water.jpg"]],
[UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",resourcePath,@"Nature/Zebra.jpg"]],
nil];

[imageScrubberToolbar setImagesArray:imagesArray];


* This source code was highlighted with Source Code Highlighter.


Добавим реализацию — (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation – этот метод будет всего лишь возвращать YES (указание, что допустима ЛЮБАЯ ориентация устройства) и — (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation – этот метод будет вызывать -(void) rebuild класса ImageScrubberToolbar.

Теперь, добавим поля класса ImageScrubberToolbar – int position – для хранения номера выбранного в данный момент изображения и int left – для хранения текущего левого отступа.

Перейдём к реализации методов обработки касаний.
Методы -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event и -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event останутся без изменений.
Изменится -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event — он будет лишь проверять количество касаний и вызывать метода -(void)imageSelected:(int) anIndex класса ImageScrubberToolbarDelegate.

Метод -(void) rebuild будет вызываться при измененении массива картинок или при вращении устройства.
Это метода всего лишь вызывает -(void) calculateLeftAndUpdatePositions:(BOOL) rotated с аргуемнтом YES.

Теперь реализуем метод, добавляющий прокрутку.

float w = [imagesArray count]*SMALL_SIZE + 2.f*SIZE_DIF;

BOOL calculated = NO;
if (w > self.frame.size.width)
{
UIView * v = [self.subviews objectAtIndex:position];
if (v.frame.origin.x + SMALL_SIZE + SIZE_DIF > self.frame.size.width)
{
left = self.frame.size.width - (position + 1)*SMALL_SIZE - SIZE_DIF;
calculated = YES;
}
else if (v.frame.origin.x < SIZE_DIF)
{
left = -position*SMALL_SIZE + SIZE_DIF;
calculated = YES;
}
}
if (rotated && !calculated)
{
left = (self.frame.size.width - w + SMALL_SIZE)/2.f;
if (left < SIZE_DIF)
{
left = SIZE_DIF;
}
}
[selectionImageView setImage:[imagesArray objectAtIndex:position]];
[self updatePositions];


* This source code was highlighted with Source Code Highlighter.


Остальные изменения незначительны и легки в понимании и реализации, поэтому скачайте и разберите пример — ImageScrubber2.

Финальный результат выглядит очень и очень симпатично, как по мне.
image
Tags:iPadAppleMac OS XXCodeObjective-C
Hubs: Development for iOS
+3
1.2k 11
Comments 1