如何使用或不使用ScrollView使ImageView可缩放。
我的IB
有一个UImageView
,并在该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; }
但这没有用,我可以看到UIScrollView
即将发布,但我的图像没有任何反应。
提前致谢。
在ViewController.h
文件中添加UIScrollViewDelegate
然后将以下代码添加到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; }
要避免UIScrollView在zoomimg上的奇怪行为,请使用此方法
- (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]; }
如果您需要更多说明,请查看此链接 。 我从那个链接学到了这个技巧。
试试这个
//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]; }
如果没有scrollView
,请将此代码scrollView
添加到您的class级:
-(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
调用addGesturesTo
。 如:
[self addGesturesTo:imageView];
使用ScrollView执行此操作:请按照下列步骤操作:
- 将
scrollView
set delegate添加到self - 在
scrolView
添加scrolView
- 实现
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
在你的类中并返回imageView