Swift全解析

文章26 |   阅读 15632 |   点赞0

来源:https://blog.csdn.net/u010586842/category_9264386.html

swift详解之二十六-----------CALayer 判断是否点击hitTest 和 contensRect

x33g5p2x  于2022-03-08 转载在 其他  
字(2.7k)|赞(0)|评价(0)|浏览(739)

CALayer 判断是否点击hitTest

CALayer并不关心任何响应链事件,所以不能直接处理触摸事件或者手势。但是它有一系列的方法帮你处理事件:containsPoint:hitTest:

下来看看这两个方法怎么使用 。

首先来看containsPoint , 首先在界面上拖一个UIView出来 , 在上面放两份layer 。

  1. ly1.frame = CGRectMake(0, 0, 20, 20)
  2. ly1.backgroundColor = UIColor.redColor().CGColor
  3. v1.layer.addSublayer(ly1)
  4. ly2.frame = CGRectMake(40, 0, 20, 20)
  5. ly2.backgroundColor = UIColor.redColor().CGColor
  6. v1.layer.addSublayer(ly2)

大概就这样的

然后重写touchesBegan 方法

  1. override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
  2. var p = (touches as NSSet).anyObject()?.locationInView(v1);
  3. p = v1.layer.convertPoint(p!, fromLayer: v1.layer)
  4. //方法1
  5. if v1.layer.containsPoint(p!) {
  6. p = ly1.convertPoint(p!, fromLayer: v1.layer)
  7. if ly1.containsPoint(p!){
  8. let alert = UIAlertView(title: "点击了", message: "第一个被点击了", delegate: nil, cancelButtonTitle: "OK")
  9. alert.show()
  10. }
  11. p = ly2.convertPoint(p!, fromLayer: v1.layer)
  12. if ly2.containsPoint(p!){
  13. let alert = UIAlertView(title: "点击了", message: "第二个被点击了", delegate: nil, cancelButtonTitle: "OK")
  14. alert.show()
  15. }
  16. }
  17. }

效果:

就这样的效果 , 别的Layer 可以暂时不管

hitTest 方法

  1. //方法2
  2. let p1 = (touches as NSSet).anyObject()?.locationInView(self.v1);
  3. //p1 = v1.layer.convertPoint(p1!, fromLayer: v1.layer)
  4. let clickLayer = ly3.hitTest(p1!)
  5. print(ly3.frame)
  6. if(clickLayer == ly3){
  7. let alert = UIAlertView(title: "点击了", message: "第三个被点击了", delegate: nil, cancelButtonTitle: "OK")
  8. alert.show()
  9. }
  10. let anoLayer = ly4.hitTest(p1!)
  11. if(anoLayer == ly4){
  12. let alert = UIAlertView(title: "点击了", message: "点击了小鸟", delegate: nil, cancelButtonTitle: "OK")
  13. alert.show()
  14. }

这个方法方便多了,代码量少多了 , 以后就用这个了。。。
看看效果

contensRect

前面讲过者个属性是用来裁剪图片的 , 用一个示例来看看这个属性的用法

这个图

先在界面上拖写view

拖到控制器

  1. @IBOutlet var digitViews: [UIView]!

一个数组 。

  1. img = UIImage(named: "sz")!
  2. for item in digitViews{
  3. item.layer.contents = UIImage(named: "sz")!.CGImage
  4. item.layer.contentsRect = CGRectMake(0, 0, 0.1, 1.0);
  5. item.layer.contentsGravity = kCAGravityResizeAspect;
  6. }
  7. let timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "showTime", userInfo: nil, repeats: true)
  8. timer.fire()
  1. func showTime(){
  2. let calendar = NSCalendar.currentCalendar()
  3. // let unitFlags =
  4. let comp = calendar.components(NSCalendarUnit.Second , fromDate: NSDate())
  5. setDigit(comp.second%10,ly: digitViews[0])
  6. setDigit(comp.second/10, ly: digitViews[1])
  7. let comp1 = calendar.components(NSCalendarUnit.Minute , fromDate: NSDate())
  8. setDigit(comp1.minute%10,ly: digitViews[2])
  9. setDigit(comp1.minute/10, ly: digitViews[3])
  10. let comp2 = calendar.components(NSCalendarUnit.Hour , fromDate: NSDate())
  11. setDigit(comp2.hour%10,ly: digitViews[4])
  12. setDigit(comp2.hour/10, ly: digitViews[5])
  13. }
  1. func setDigit(t:Int,ly:UIView){
  2. ly.layer.contentsRect = CGRectMake(0.1*CGFloat(t),0,0.1, 1);
  3. }

效果大家也看到了 , 就是上面图下面的那个电子表

源代码:https://github.com/smalldu/SwiftStudy
学习iOS,有他就够了,小码哥视频,传智、黑马、各种swift书籍

相关文章