我不是在谈论缩放如何在这里工作。
有人注意到Instagram的缩放吗?它可以作为默认的工作,但是当你开始放大它时,imageView会扩展到设备的整个屏幕,它们如何顺利?有人知道可以指出吗?
答案 0 :(得分:4)
我创建了一个简单的Github项目,完全符合您的要求。看看这里: https://github.com/twomedia/TMImageZoom
我通过创建一个处理手势状态变化的类来实现这一目标。然后,我在窗口上创建一个UIImageView,并将其定位/调整到原始图像视图,从而创建用户缩放imageView的效果。这是以上链接中的一小段代码:
-(void) gestureStateChanged:(id)gesture withZoomImageView:(UIImageView*)imageView {
// Insure user is passing correct UIPinchGestureRecognizer class.
if (![gesture isKindOfClass:[UIPinchGestureRecognizer class]]) {
NSLog(@"(TMImageZoom): Must be using a UIPinchGestureRecognizer, currently you're using a: %@",[gesture class]);
return;
}
UIPinchGestureRecognizer *theGesture = gesture;
// Prevent animation issues if currently animating reset.
if (isAnimatingReset) {
return;
}
// Reset zoom if state = UIGestureRecognizerStateEnded
if (theGesture.state == UIGestureRecognizerStateEnded || theGesture.state == UIGestureRecognizerStateCancelled || theGesture.state == UIGestureRecognizerStateFailed) {
[self resetImageZoom];
}
// Ignore other views trying to start zoom if already zooming with another view
if (isHandlingGesture && hostImageView != imageView) {
NSLog(@"(TMImageZoom): 'gestureStateChanged:' ignored since this imageView isnt being tracked");
return;
}
// Start handling gestures if state = UIGestureRecognizerStateBegan and not already handling gestures.
if (!isHandlingGesture && theGesture.state == UIGestureRecognizerStateBegan) {
isHandlingGesture = YES;
// Set Host ImageView
hostImageView = imageView;
imageView.hidden = YES;
// Convert local point to window coordinates
CGPoint point = [imageView convertPoint:imageView.frame.origin toView:nil];
startingRect = CGRectMake(point.x, point.y, imageView.frame.size.width, imageView.frame.size.height);
// Post Notification
[[NSNotificationCenter defaultCenter] postNotificationName:TMImageZoom_Started_Zoom_Notification object:nil];
// Get current window and set starting vars
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
firstCenterPoint = [theGesture locationInView:currentWindow];
// Init zoom ImageView
currentImageView = [[UIImageView alloc] initWithImage:imageView.image];
currentImageView.contentMode = UIViewContentModeScaleAspectFill;
[currentImageView setFrame:startingRect];
[currentWindow addSubview:currentImageView];
}
// Reset if user removes a finger (Since center calculation would cause image to jump to finger as center. Maybe this could be improved later)
if (theGesture.numberOfTouches < 2) {
[self resetImageZoom];
return;
}
// Update scale & center
if (theGesture.state == UIGestureRecognizerStateChanged) {
NSLog(@"gesture.scale = %f", theGesture.scale);
// Calculate new image scale.
CGFloat currentScale = currentImageView.frame.size.width / startingRect.size.width;
CGFloat newScale = currentScale * theGesture.scale;
[currentImageView setFrame:CGRectMake(currentImageView.frame.origin.x, currentImageView.frame.origin.y, startingRect.size.width*newScale, startingRect.size.height*newScale)];
// Calculate new center
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
int centerXDif = firstCenterPoint.x-[theGesture locationInView:currentWindow].x;
int centerYDif = firstCenterPoint.y-[theGesture locationInView:currentWindow].y;
currentImageView.center = CGPointMake((startingRect.origin.x+(startingRect.size.width/2))-centerXDif, (startingRect.origin.y+(startingRect.size.height/2))-centerYDif);
// Reset gesture scale
theGesture.scale = 1;
}
}
答案 1 :(得分:1)
复制此行为的一种方法可能是向UIPinchGestureRecognizer
添加UIImageView
。然后使用scale
的{{1}}属性并相应地缩放UIPinchGestureRecognizer
的框架。 example
答案 2 :(得分:1)
我建议使用第三方库。它们总是很容易集成和使用
尝试检查这些:
Rey Wenderlish guides are pretty nice too
无论如何,只需谷歌吧!,祝你好运!