[Swift通天遁地]三、手势与图表-(2)监听手势事件自由拖动图像视图
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10210565.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示监听手势事件,使图片可以自由被拖动。
在项目导航区,打开视图控制器的代码文件【ViewController.swift】
现在开始编写代码,实现监听手势事件自由拖动的图像视图。
1 import UIKit 2 3 class ViewController: UIViewController 4 { 5 //给类添加一个属性,作为被拖动的图像视图。 6 var imageView : UIImageView! 7 //添加一个属性,用于判断图片是否被按下。 8 var isTouchInImageView : Bool = false 9 10 override func viewDidLoad() 11 { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view, typically from a nib. 14 15 //从项目中加载图片资源 16 let image = UIImage(named: "Star") 17 //使用图像视图显示加载的图片 18 self.imageView = UIImageView(image: image) 19 //将图像视图添加到根视图中 20 self.view.addSubview(self.imageView) 21 } 22 23 //添加一个方法,用来监听手指按下时的事件 24 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 25 { 26 //可能时多个手指同事按下, 27 //这里获取第一个触摸对象。 28 let touch = touches.first 29 //获得触摸对象的坐标 30 let touchPoint = touch?.location(in: self.view) 31 32 //获得图像视图的显示区域 33 let imageViewFrame = self.imageView.frame 34 //获得图像显示区域的左上角的坐标 35 let minX = imageViewFrame.origin.x 36 let minY = imageViewFrame.origin.y 37 //获得图像显示区域的右下角的坐标 38 let maxX = minX + imageViewFrame.size.width 39 let maxY = minY + imageViewFrame.size.height 40 //将触摸位置的坐标,和左上角以及右下角的坐标进行比较, 41 //从而判断触摸的位置是否位于图像的区域。 42 if (touchPoint?.x)! >= minX && (touchPoint?.y)! <= maxX && (touchPoint?.y)! >= minY && (touchPoint?.y)! <= maxY 43 { 44 //当触摸在图像区域时,设置布尔属性的值为真, 45 isTouchInImageView = true; 46 //然后在控制台输出日志信息。 47 print("You got a star."); 48 } 49 } 50 51 //添加一个方法,用来监听手指移动时的事件 52 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 53 { 54 //判断当触摸位置不在图像区域时,不再执行后方的代码。 55 if !isTouchInImageView 56 { 57 return; 58 } 59 //获取第一个触摸对象 60 let touch = touches.first 61 //获得触摸对象的坐标 62 let touchPoint = touch?.location(in: self.view) 63 //获得触摸对象在上一个位置时的坐标 64 let touchPrePoint = touch?.previousLocation(in: self.view) 65 //计算两个坐标之间的偏移距离 66 let disX = (touchPoint?.x)! - (touchPrePoint?.x)! 67 let disY = (touchPoint?.y)! - (touchPrePoint?.y)! 68 69 //获得图像视图中心点的坐标 70 var centerPoint = self.imageView.center 71 //然后将该坐标和偏移距离相加,作为图像视图新的位置 72 centerPoint.x += disX 73 centerPoint.y += disY 74 //刷新图像视图中心点的坐标 75 self.imageView.center = centerPoint 76 } 77 78 //添加一个方法,用来监听手指移动结束时的事件。 79 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 80 { 81 //当手指移开屏幕时,设置布尔属性的值为假。 82 isTouchInImageView = false; 83 } 84 85 override func didReceiveMemoryWarning() { 86 super.didReceiveMemoryWarning() 87 // Dispose of any resources that can be recreated. 88 } 89 }