2012-06-26 7 views
0

저는 iOS 개발의 초보자입니다. 나는 확대/축소 가능하고 pannable해야하는 이미지 (사실 맵)를 표시하려고합니다. 내 문제는 항상 같은 위치를 나타내는 팬을 따르는 오버레이를 추가하는 방법을 모르지만 확대/축소에 의해 크기가 조정되지 않습니다. 몇 가지 오버레이가 있으며 각 오버레이는 클릭 할 수 있어야합니다.오버레이를 확대하지 않고 배경 이미지 확대

이미지 (지도)를 확대/축소 및 이동하려면 UIImageViewUIScrollView에 추가했는데 효과적 이었지만이 기능을 추가하는 방법을 모릅니다.

나는이 스레드를 찾았지만 그의 오버레이가 정적이기 때문에 정말 같은 문제가되지 않습니다 : UIScrollview with two images - Keeping 1 image zoomable and 1 image static (fixed size)

내가 안드로이드에서 동일한 응용 프로그램을 경제력 한, 나는의 픽셀을 변환 된이 작품을 만들기 위해 변환 행렬 덕택에 화면 좌표로지도를 만들고 onDraw 메서드를 오버라이드하여 표시했지만 iOS에서 동일한 작업을 수행하는 방법을 알지 못합니다. 이것이 더 나은 해결책인지는 잘 모릅니다.

도움 주셔서 감사합니다.

답변

2

는 그래서, 그것을 할 수있는 방법을 발견했다.

확대하기 위해
+CustomScrollView 
----> UIImageView (map) 
----> OverlayImageView (overlay) 

, 사용자 지정있는 ScrollView는 다음과 같은 방법으로 위임해야합니다 :이

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    //The background image with the map 
    return mapView; 
} 

//When a zoom occurs, move the overlay 
- (void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    UIImageView* overlayView = [scroll.subviews objectAtIndex:1]; 
    float x; 
    float y; 
    float width; 
    float height; 

    //keep the width and height of the overlay 
    width = overlayView.frame.size.width; 
    height = overlayView.frame.size.height; 
    //Move it to stay over the same pixel of the map, and centers it 
    x = (self.overlay.point.x * scroll.zoomScale - width/2); 
    y = (self.overlay.point.y * scroll.zoomScale - height/2); 

    overlayView.frame = CGRectMake(x,y,width,height); 
} 

을, 우리는 줌 배경 이미지 만 발생한다는되지만, 오버레이 등 UIScrollView에 있습니다. 따라서 우리가 신경 써야 할 것은 줌이 바뀌면 오버레이를 움직이는 것입니다. 우리는 scrollViewDidZoom 방법으로 그것을 알고 있습니다.

터치 이벤트를 처리하려면 touchEnded:withEvent:CustomScrollView으로 대체하고 탭이 하나만있는 경우 오버레이로 전달합니다. 터치를 처리하기 위해 동일한 방법 (toucheEnded:withEvent:) 만 덮어 쓰기 때문에 나는 OverlayImageView을 표시하지 않습니다.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch* touch = [touches anyObject]; 
    // Coordinates in map view 
    CGPoint point = [touch locationInView:[self.subviews objectAtIndex:0]]; 

    //forward 
    if(touch.tapCount == 1){ 
     OverlayImageView* overlayView = [self.subviews objectAtIndex:1]; 
     CGPoint newPoint = [touch locationInView:overlayView]; 

     BOOL isInside = [overlayView pointInside:newPoint withEvent:event]; 

     if(isInside){ 
      [overlayView touchesEnded:touches withEvent:event]; 
     } 
    } 
    // zoom 
    else if(touch.tapCount == 2){ 


     if(self.zoomScale == self.maximumZoomScale){ 
      [self setZoomScale:[self minimumZoomScale] animated:YES]; 
     } else { 
      CGRect zoomRect = [self zoomRectForScrollView:self withScale:self.maximumZoomScale withCenter:point];    

      [self zoomToRect:zoomRect animated:YES]; 
      //[self setZoomScale:[self maximumZoomScale] animated:YES]; 
     } 

     [self setNeedsDisplay]; 

    } 
} 

희망이 도움이 될 것입니다.

+0

더 많은 코드를 게시 할 수 있습니까? 나는 또한 이것을 얻으려고 노력하지만 할 수는 없다. – Devang

0

오버레이로 위에 imageView를 놓고 userInteractionEnabled 속성을 NO로 설정할 수 있습니다. 그런 다음이를 프로그래밍 방식으로 팬해야합니다.

나는 배경 이미지 (지도)과 함께있는 ScrollView 내 오버레이를 추가 : 누군가 도움이 할 수있는 경우에 확인

+0

사용자가 오버레이를 클릭 할 수 있으므로 userInteractionEnabled를 NO로 설정할 수 없습니다 (이 것을 잊어 버렸습니다). 그러나 나는 이런 식으로 시도 할 것입니다. 그런 식으로 생각하지 않았습니다. 고마워요. – Oyashiro

관련 문제