2011-01-27 65 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