我目前可以使用 Apple 提供的捏合手势识别器进行图像缩放,但是如何限制图像的最大缩放比例?
我一直在使用 Apple 的 SimpleGestureRecognizers 示例,它将比例设置为 1,并且很容易缩放图像,但是当我删除它时,它会突然跳跃,这不是很好。但是由于它总是设置为 1,因此很难跟踪比例。
先感谢您。
我目前可以使用 Apple 提供的捏合手势识别器进行图像缩放,但是如何限制图像的最大缩放比例?
我一直在使用 Apple 的 SimpleGestureRecognizers 示例,它将比例设置为 1,并且很容易缩放图像,但是当我删除它时,它会突然跳跃,这不是很好。但是由于它总是设置为 1,因此很难跟踪比例。
先感谢您。
UIKit 将针对单个用户手势(捏合)多次调用您的选择器方法。每次调用将代表比例的一个小增量(或减少)。如果您处理对该方法的每次调用并为每个小增量相应地缩放图像,您将获得平滑的动画。
您使用识别器的比例属性来修改您的图像。然后,将该属性重置为 1.0,以便下次调用选择器方法时, scale 属性仅表示自上次以来的新小增量。您再次通过新的小增量重新缩放图像并重置为 1.0。如果您不重置识别器的比例并使用它来重新缩放图像,您将通过累积变化来缩放图像,从而导致跳跃行为(和不正确的缩放)。
因此,请确保将手势识别器的比例重置为 1。要跟踪比例的总变化,您可以为 UIImageView 或 ViewController 创建一个实例变量,也可能称为“比例”。(实际上,如果您在 drawRect 中使用了新的比例变量来绘制图像,则只需在 setter 中添加对 setNeedsDisplay 的调用。当比例发生变化时,您无需编写任何代码来重绘图像.)
在任何情况下,以下代码(包含 Ravin 的限制检查,但在新的 scale 变量上)应该适用于您的选择器方法:
- (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;
}
}
我希望这是有帮助的。
如果您只在一个地方执行此操作并且您不想将 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
}
}
在gestureRecognizer
检查( )scale
属性的选择器方法中,如果它小于您希望缩放的值,请在图像上应用缩放,否则不要。例如,以下方法适用于then 。sender
UIPinchGestureRecognizer
selector
pinchGesture
-(void)pinchAction:(UIPinchGestureRecognizer *)sender
{
if(sender.scale<yourScaleLimit)
{
//scale up the image
}
}
谢谢,