2011-01-27 3 views
1

UIPinchGestureRecognizer 및 배율 방법을 사용하여지도의 그림을 프로그래밍 방식으로 배율을 조정할 수있는 것에 가깝습니다. 나는 스크롤 뷰를 다음과 같이 시도했다 : [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

내가 확실히 모르는, 내가 테스트하고 싶지 않지만 제스처없이 imageviews 작동하지 않습니다

mapImageView.userInteractionEnabled = YES; 

추가하려고 이 설정.
편집 : 어쩌면 내가 당신의 질문을 잘못 해석하고 귀하의 스케일링 방법을 호출하지만 작동하지 않습니다.


Btw, 약 CATiledLayer을 읽으셨습니까? WWDC10 세션 비디오 (세션 104 - 스크롤보기가 포함 된 응용 프로그램 디자인하기)에는 훌륭한 소개가 있습니다.
2437x1536 이미지가 아이폰에서 상당히 크기 때문에이 이미지를 시청해야합니다. 조만간 성능 및/또는 메모리 문제가 발생할 것입니다.

+0

감사합니다. 그게 .. 누군가가보기에서 또는 뭔가보기로 래핑하여 이것을 해결하는 것을 보았다고 생각하지만, 그것은 더 쉬운 방법입니다. 그리고 당신 말이 맞아요, 나는 아마도 CATiledLayer를 사용할 필요가 있습니다. 왜냐하면 저는 메모리 문제로 달리고 때로는 부서 지기도합니다. – VagueExplanation

+0

당신은 제 질문을 잘못 해석하지 않았습니다. – VagueExplanation