В предыдущей части мы создали в общем-то страшненькую полосу прокрутки, которая, к тому же, некорректно работает с контентом, превыщающим её ширину да и не откликается на повороты девайса.
Сегодня мы постараемся исправить данные недостатки.
Удалим 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.
Добавим реализацию — (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.
Теперь реализуем метод, добавляющий прокрутку.
Остальные изменения незначительны и легки в понимании и реализации, поэтому скачайте и разберите пример — ImageScrubber2.
Финальный результат выглядит очень и очень симпатично, как по мне.

Сегодня мы постараемся исправить данные недостатки.
Удалим 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.
Финальный результат выглядит очень и очень симпатично, как по мне.
