Предположим, что мы хотим сделать аналог программы, через которую можно смотреть фотографии на iPhone. Одной составляющей этой программы является мультитач зум. Далее вы узнаете как его сделать.

Я предлагаю написать класс, которому мы будем задавать картинку. Этот класс можно будет положить на любой UIView. Для того, чтобы сделать зум нам понадобится UIScrollView и протокол его делегата UIScrollViewDelegate.

UIScrollView может зумить любой UIView (либо унаследованное от него), который на нем лежит, но только один. Чтобы зум начал работать достаточно сделать 3 вещи:

  • Выставить максимальный уровень зума
  • Выставить минимальный уровень зума
  • Определить в делегате специальный метод, который будет показывать какой UIView зумить

Унаследуем наш класс от UIScrollView и сделаем его делегатом для самого себя. Еще нам необходимо создать UIImageView, который будет показывать картинку. Приведем файл ZoomView.h

@interface ZoomView : UIScrollView {

UIImageView* m_imageView;
UIImage* m_image;
}
@property (nonatomic, readonly) UIImageView* imageView;
@property (nonatomic, copy) UIImage* image;
-(id) initWithImage:(UIImage*)image frame:(CGRect)frame;
@end

Как видим, у нас два свойства — одно для доступа к UIImageView (только для чтения), другое — картинка, ее мы можем менять в любое время.

Конструктор принимает два аргумента — картинку и frame. В конструкторе мы должны сохранить картинку, назначить делегат на себя и создать UIImageView:

-(id) initWithImage:(UIImage*)image frame:(CGRect)frame {

self = [super initWithFrame:frame];
self.delegate = self;
m_image = [image copy];
[self createImageViewWithImage:m_image];
return self;
}

Тут мы встретили непонятный метод:

[self createImageViewWithImage:m_image];

Он всего-лишь создает UIImageView, его код:

// создает imageView

-(void) createImageViewWithImage:(UIImage*)image {
m_imageView = [[UIImageView alloc] initWithImage:image];
// назначить всю доступную область
m_imageView.frame = self.bounds;
// режим отображения картинки
m_imageView.contentMode = UIViewContentModeScaleAspectFit;
// максимальный и минимальный зум
[self setMinimumZoomScale:1.0];
[self setMaximumZoomScale:2.0];
[self addSubview:m_imageView];
}

В этом методе мы сделали два обязательных пункта — назначили минимальный и максимальный уровень зума. Выполним третий пункт — метод делегата, который должен возвращать UIView, который нужно зумить:

// делегат UIScrollView, должен возвращать то что надо зумить

-(UIView*) viewForZoomingInScrollView:(UIScrollView *)scrollView {
return m_imageView;
}

Приведу полный код файла ZoomView.m

#import "ZoomView.h"

@implementation ZoomView
@synthesize imageView;
// создает imageView
-(void) createImageViewWithImage:(UIImage*)image {
m_imageView = [[UIImageView alloc] initWithImage:image];
// назначить всю доступную область
m_imageView.frame = self.bounds;
// режим отображения картинки
m_imageView.contentMode = UIViewContentModeScaleAspectFit;
// максимальный и минимальный зум
[self setMinimumZoomScale:1.0];
[self setMaximumZoomScale:2.0];
[self addSubview:m_imageView];
}
// меняет картинку в UIImageView
-(void) changeImageTo:(UIImage*)image {
m_imageView.image = image;
}
// позволяет установить картинку из-вне
-(void) setImage:(UIImage *)image {
[m_image release];
m_image = nil;
if ( image != nil ) {
m_image = [image copy];
// если imageView еще не создано - создать
if ( m_imageView == nil ) {
[self createImageViewWithImage:m_image];
}
[self changeImageTo:m_image];
}
}
-(UIImage*) image {
return [[m_image copy] autorelease];
}
// конструторы и деструктор
-(id) initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
self.delegate = self;
return self;
}
-(id) init {
return [self initWithFrame:CGRectZero];
}
-(id) initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
self.delegate = self;
return self;
}
-(id) initWithImage:(UIImage*)image frame:(CGRect)frame {
self = [super initWithFrame:frame];
self.delegate = self;
m_image = [image copy];
[self createImageViewWithImage:m_image];
return self;
}
-(void) dealloc {
self.delegate = nil;
[m_imageView release];
[m_image release];
[super dealloc];
}
// делегат UIScrollView, должен возвращать то что надо зумить
-(UIView*) viewForZoomingInScrollView:(UIScrollView *)scrollView {
return m_imageView;
}
@end

Когда мы имеем полностью реализованный класс — мы можем его использовать. В вашем ViewController подключите файл ZoomView.h:

#import "ZoomView.h"

Достаточно создать экземпляр класса, передать картинку и размеры:

ZoomView* zoomView = [[ZoomView alloc] initWithImage:[UIImage imageNamed:@"ИМЯ_КАРТИНКИ_В_ПРОЕКТЕ.jpg"] frame:self.view.bounds ];

И добавить на вид:

[self.view addSubview:zoomView];

Добавьте любую картинку в проект и введите ее имя при создании класса ZoomView.

Чтобы зумить картинку в симуляторе — зажмите Alt (Option) и подвигайте мышью.

Исходный код можно скачать тут.

Похожие статьи

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

  • Как вводить в UITextField только цифры?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *