2011-01-27 64 views
1

我真的很接近于能够用UIPinchGestureRecognizer和scale方法以编程方式缩放地图的图片。我尝试了这样的滚动视图:[mapScrollView addGestureRecognizer:pinchRecognizer];,但当然这不起作用,因为这将缩放整个视图和界限。如果我做[mapImageView addGestureRecognizer:pinchRecognizer]什么都不会发生。我应该如何使用UIPinchGestureRecognizer缩放此地图图片?

如何缩放滚动视图中的图像?甚至更多,我如何设置最大和最小比例的界限?由于

代码:

- (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]; 
} 

回答

2

我不肯定知道,我不想要测试,但尝试添加

mapImageView.userInteractionEnabled = YES; 

手势不要imageviews不工作这个设置。
编辑:也许我已经解释你的问题错了,你的缩放方法被调用,但不起作用。


顺便说一句,你读过关于CATiledLayer吗? WWDC10会话视频(会话104 - 使用滚动视图设计应用程序)也有很好的介绍。您应该通过developer.apple.com获取该视频
您应该观看它,因为2437x1536图像对iPhone来说非常大。迟早你会遇到性能和/或内存问题。

+0

谢谢!就是这样..我想我已经看到有人通过在视图或视图中包装视图来解决这个问题,但这样更容易。你说得对,我需要使用CATiledLayer,因为我遇到内存问题,有时会崩溃等。 – VagueExplanation 2011-01-27 22:29:56