Как мне масштабировать эту карту карту с помощью Uipinchgesturerecognizer?
Вопрос
Я очень близок к тому, чтобы иметь возможность масштабировать изображение карты программно с UIPinchGestureRecognizer
и метод масштаба. Я попробовал представление о прокрутке так: [mapScrollView addGestureRecognizer:pinchRecognizer];
, но, конечно, это не сработает, потому что это будет масштабировать весь взгляд и границы. Если я сделаю [mapImageView addGestureRecognizer:pinchRecognizer]
ничего не случится.
Как мне масштабировать изображение внутри вида свитка? Более того, как мне установить границы максимального масштаба и майна? Спасибо
Код:
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate];
map_List = [[NSMutableArray alloc] init];
[map_List addObject:@"Pacific_Map_8bit.png"];
[map_List addObject:@"Atlantic_Map_8bit.png"];
CGRect mapScrollViewFrame = CGRectMake(0, 0, 1024, 768);
mapScrollView = [[UIScrollView alloc] initWithFrame:mapScrollViewFrame];
mapScrollView.contentSize = CGSizeMake(2437, 1536);
UIImage *mapImage = [UIImage imageNamed:[map_List objectAtIndex:mapNum]];
mapImageView = [[UIImageView alloc] initWithImage: mapImage];
mapScrollView.bounces = NO;
[mapImage release];
[mapScrollView addSubview:mapImageView];
[self addSubview:mapScrollView];
UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
[mapImageView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
UIImage *footerMapIMG = [UIImage imageNamed:@"footer_map_alternate.png"];
UIImageView *footerMapView = [[UIImageView alloc] initWithImage:(UIImage *)footerMapIMG];
CGRect footerMapFrame = CGRectMake(0, 686, 213, 82);
footerMapView.frame = footerMapFrame;
[self addSubview:footerMapView];
footerMapView.image = footerMapIMG;
[footerMapView release];
CGRect backBTNFrame = CGRectMake(20, 714, 140, 52);
UIButton *MAP_backButton = [[UIButton alloc] init];
MAP_backButton.frame = backBTNFrame;
UIImage *MAP_backButtonIMG = [UIImage imageNamed:@"button_back.png"];
[MAP_backButton setImage:MAP_backButtonIMG forState:UIControlStateNormal];
MAP_backButton.backgroundColor = [UIColor clearColor];
[self addSubview:MAP_backButton];
[MAP_backButton release];
[MAP_backButton addTarget:del.switchVC
action:@selector(gotoMapAndListChooser)
forControlEvents:UIControlEventTouchUpInside];
}
return self;
}
-(void)scale:(id)sender {
if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
lastScale = 1.0;
return;
}
CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);
/*
if(scale > 1){
scale = 1;
}
if(scale < .5){
scale = .5;
}
*/
CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
[[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];
lastScale = [(UIPinchGestureRecognizer*)sender scale];
}
Решение
Я не знаю наверняка, и я не хочу проверять, но пытаюсь добавить
mapImageView.userInteractionEnabled = YES;
Жесты не работают над изображениями без этой настройки.
РЕДАКТИРОВАТЬ: Может быть, я неправильно интерпретировал ваш вопрос, и ваш метод масштабирования вызывается, но не работает.
Кстати, вы читали о Catiledlayer? Существует также отличное введение в видео сеанса WWDC10 (сеанс 104 - Разработка приложений с просмоткой прокрутки). Вы должны добраться до этого видео через Developer.apple.com
Вы должны посмотреть его, потому что изображение 2437x1536 довольно большое для iPhone. Вы столкнетесь с проблемами производительности и/или памяти рано или поздно.