0

に があり、UImageViewそのIB上にマップ イメージを追加しましたUImageView。その画像をピンチズーム可能にしたい。

これが私のコードです:

- (void)viewDidLoad
{
   [super viewDidLoad];
    self.title = @"Map";

   self.mapImageView.contentMode = UIViewContentModeScaleAspectFit;
   [self.mapScrollView addSubview:self.mapImageView];
   [self.mapScrollView setContentSize:CGSizeMake(self.mapImageView.frame.size.width, self.mapImageView.frame.size.height)];
   [self.mapScrollView setMinimumZoomScale:1.0];
   [self.mapScrollView setMaximumZoomScale:4.0];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
   return self.mapImageView;
}

しかし、これは役に立ちません。Coming を見ることはできますが、UIScrollView私のイメージには何も起こりません。
前もって感謝します。

4

3 に答える 3

3

ファイルUIScrollViewDelegateに追加ViewController.h

ViewController.m次に、次のコードをファイルに追加します

UIPinchGestureRecognizerこのコードを使用している場合は追加する必要はありません

    - (void)scrollViewDidZoom:(UIScrollView *)scrollView
    {

    UIView* zoomView = [scrollView.delegate viewForZoomingInScrollView:scrollView];

    CGRect zoomViewFrame = zoomView.frame;

    if(zoomViewFrame.size.width < scrollView.bounds.size.width)

    {

    zoomViewFrame.origin.x = (scrollView.bounds.size.width - zoomViewFrame.size.width) / 2.0;

    }

    else

    {
    zoomViewFrame.origin.x = 0.0;
    }

    if(zoomViewFrame.size.height < scrollView.bounds.size.height)

     {      zoomViewFrame.origin.y = (scrollView.bounds.size.height - zoomViewFrame.size.height) / 2.0;

    }
    else

    {
    zoomViewFrame.origin.y = 0.0;
    }
    zoomView.frame = zoomViewFrame;
    }

viewDidLoad以下のように変更

- (void)viewDidLoad
 {
     [super viewDidLoad];
    self.mapScrollView.delegate = self;
    self.mapScrollView.minimumZoomScale = 1.0;
    self.mapScrollView.maximumZoomScale = 4.0;
    UIImage * myImage= [UIImage imageNamed:@"Background.png"]; //add your image here
    [self.mapImageView setImage:myImage];
    [self.mapImageView sizeToFit];
    self.mapScrollView.contentSize = myImage.size;

}

ここでズームするimageViewを指定します

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.mapImageView;
}

zoomimg での UIScrollView の奇妙な動作を回避するには、このメソッドを使用します

- (void)view:(UIView*)view setCenter:(CGPoint)centerPoint
{
    CGRect viewFrame = view.frame;
        CGPoint contentOffset = self.mapScrollView.contentOffset;

        CGFloat x = centerPoint.x - viewFrame .size.width / 2.0;
        CGFloat y = centerPoint.y - viewFrame .size.height / 2.0;

    if(x < 0)
    {
        contentOffset.x = -x;
        viewFrame .origin.x = 0.0;
    }
    else
    {
        viewFrame .origin.x = x;
    }
    if(y < 0)
    {
        contentOffset.y = -y;
        viewFrame .origin.y = 0.0;
    }
    else
    {
        viewFrame .origin.y = y;
    }

    view.frame = viewFrame ;
    self.mapScrollView.contentOffset = contentOffset;
}

次に、viewDidAppear で上記のメソッドを呼び出します

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    CGPoint centerPoint = CGPointMake(CGRectGetMidX(self.mapScrollView.bounds),
                                  CGRectGetMidY(self.mapScrollView.bounds));
    [self view:self.mapImageView setCenter:centerPoint];
}

さらに明確にする必要がある場合は、このリンクをご覧ください。そのリンクからこのテクニックを学びました。

于 2013-05-21T10:55:26.747 に答える
2

これで試してください

    //At ViewDidLoad (OR whare you create your mapImageView)
   UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
   [pinchRecognizer setDelegate:self];
   [mapImageView addGestureRecognizer:pinchRecognizer];

   mapImageView.userInteractionEnabled=YES;




   -(void)scale:(id)sender {
       [YourView bringSubviewToFront:[(UIPinchGestureRecognizer*)sender view]];

       if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {
           lastScale = 1.0;  //global float variable.
           return;
       }

       CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);

       CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
       CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

       [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];
   }
于 2013-05-21T09:30:27.080 に答える
0

なしscrollViewでそれを行うには、このスニペットをクラスに追加します。

-(void) addGesturesTo : (UIImageView *) imageView{
    // Register for double-finger dragging to pan the camera.
    UIPinchGestureRecognizer* pinchGestureReconizer = [[UIPinchGestureRecognizer alloc] initWithTarget: self                                                                                                    action: @selector(handlePich:)];
    [imageView addGestureRecognizer:pinchGestureReconizer];
}
- (void) handlePich: (UIPinchGestureRecognizer *) pinchGestureRecognizer{
    CGFloat scale = pinchGestureRecognizer.scale;
    [[pinchGestureRecognizer view]  setTransform:CGAffineTransformScale([pinchGestureRecognizer view].transform, scale, scale)];
    pinchGestureRecognizer.scale = 1.0;
}

addGesturesToで呼び出しますimageView。として:

[self addGesturesTo:imageView];

ScrollView でそれを行うには: 次の手順に従います。

  • scrollViewset デリゲートを自分自身に追加
  • imageView内側に追加scrolView
  • クラスに実装- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;して返すimageView
于 2013-05-21T09:35:18.217 に答える