Sol*_*ola 5 iphone objective-c scale pinch ios
我目前能够使用Apple提供的捏合手势识别器进行图像缩放,但是如何限制图像的最大比例?
我一直在使用Apple 的 SimpleGestureRecognizers示例,它将比例设置为1,并且可以很容易地缩放图像,但是当我删除它时,它会突然跳转,这是不好的.但是,由于它总是设置为1,因此很难跟踪比例.
先感谢您.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这是有帮助的.
如果您只在一处执行此操作,并且不想子类化 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
}
}
Run Code Online (Sandbox Code Playgroud)