2011-01-27 2 views
1

Je suis vraiment proche d'être capable de mettre à l'échelle une image d'une carte par programmation avec UIPinchGestureRecognizer et une méthode d'échelle. J'ai essayé une vue de défilement comme ceci: [mapScrollView addGestureRecognizer:pinchRecognizer];, mais bien sûr cela ne fonctionnera pas parce que cela mettra à l'échelle l'ensemble de la vue et les limites. Si je fais [mapImageView addGestureRecognizer:pinchRecognizer] rien ne se passera.Comment devrais-je redimensionner cette image de carte avec UIPinchGestureRecognizer?

Comment redimensionner l'image dans la vue défilement? Encore plus, comment puis-je définir des limites de mise à l'échelle max et min? Merci

Le code:

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

Répondre

2

Je ne sais pas pour sûr, et je ne veux pas tester, mais essayez d'ajouter

mapImageView.userInteractionEnabled = YES; 

Gestures ne fonctionnent pas sur imageviews sans ce paramètre.
EDIT: J'ai peut-être mal interprété votre question et votre méthode de mise à l'échelle est appelée mais ne fonctionne pas.


BTW, avez-vous lu à propos CATiledLayer? Il y a aussi une excellente introduction dans les vidéos de session WWDC10 (Session 104 - Concevoir des applications avec des vues de défilement). Vous devriez arriver à cette vidéo via developer.apple.com
Vous devriez le regarder, car une image 2437x1536 est assez grande pour l'iphone. Vous rencontrerez tôt ou tard des problèmes de performances et/ou de mémoire.

+0

Merci! C'était ça .. Je pense que j'ai vu quelqu'un résoudre ça en entourant une vue dans une vue ou quelque chose, mais c'est beaucoup plus facile. Et vous avez raison, je dois probablement utiliser le CATiledLayer parce que je suis en train de courir dans des problèmes de mémoire, parfois s'écraser, etc – VagueExplanation

+0

Vous n'avez pas interprété ma mauvaise question. – VagueExplanation