Pull to refresh

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

Reading time 5 min
Views 1.3K
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:
Hubs:
+3
Comments 1
Comments Comments 1

Articles