我目前能够使用Apple提供的捏合手势识别器进行图像缩放,但是如何限制图像的最大比例?
我一直在使用Apple的SimpleGestureRecognizers sample,它将比例设置为1,并且可以很容易地缩放图像,但是当我删除它时,它会突然跳跃,这不太好。但是,由于它总是设置为1,因此很难跟踪比例。
提前谢谢。
答案 0 :(得分:8)
UIKit会针对单个用户手势(捏合)多次调用您的选择器方法。每个调用将表示比例中的小增量(或减少)。如果您处理对方法的每次调用并相应地为每个小增量缩放图像,您将获得平滑的动画。
您可以使用识别器的缩放属性来修改图像。然后,将属性重置为1.0,以便下次调用选择器方法时,scale属性仅表示自上一个以来的新的小增量。您再次通过新的小增量重新缩放图像并重置为1.0。如果您没有重置识别器的比例并使用它来重新缩放图像,您将按累积变化缩放图像,从而导致跳跃行为(以及不正确的缩放。)
因此,请确保将手势识别器的比例重置为1.要跟踪比例的总变化,您可以为UIImageView或ViewController创建一个实例变量,可能也称为“scale”。 (事实上,如果你在drawRect中使用那个新的scale变量来绘制你的图像,你只需要在setter中添加对setNeedsDisplay的调用。当你缩放时,你不必编写任何代码来重绘图像。)
在任何情况下,以下代码(包含Ravin的限制检查,但在新的比例变量上)应适用于您的选择器方法:
- (void)pinch:(UIPinchGestureRecognizer *)recognizer
{
if (recognizer.state == UIGestureRecognizerStateChanged ||
recognizer.state == UIGestureRecognizerStateEnded) {
if (imageView.scale < yourScaleLimit) {
imageView.scale *= recognizer.scale;
//any other code to scale up the image if
//just changing imageView.Scale is not enough
}
recognizer.scale = 1.0;
}
}
我希望这有用。
答案 1 :(得分:1)
如果只在一个地方执行此操作,并且不想对UIView或UIImageView进行子类化,则可以创建一些局部变量来实现相同的结果。
快速
// Variables to keep track of the scale
var imageViewScale: CGFloat = 1.0
let maxScale: CGFloat = 4.0
let minScale: CGFloat = 0.5
@objc func handlePinchGesture(recognizer: UIPinchGestureRecognizer) {
if recognizer.state == .began || recognizer.state == .changed {
let pinchScale: CGFloat = recognizer.scale
if imageViewScale * pinchScale < maxScale && imageViewScale * pinchScale > minScale {
imageViewScale *= pinchScale
imageView.transform = (imageView.transform.scaledBy(x: pinchScale, y: pinchScale))
}
recognizer.scale = 1.0
}
}
答案 2 :(得分:0)
在gestureRecognizer
检查scale
sender
UIPinchGestureRecognizer
属性的选择器方法中,如果它小于您希望缩放的比例,请在图像上应用缩放,否则不要。例如,对于selector
,以下方法为pinchGesture
。
-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
if(sender.scale<yourScaleLimit)
{
//scale up the image
}
}
谢谢,