Swift CALayer响应点击事件

作者: HeartPower | 来源:发表于2016-10-30 20:10 被阅读277次

CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些像图片,文本或者背景的内容。和UIView最大的不同是CALayer不处理用户的交互。但它有一系列的方法帮你处理事件:-containsPoint和-hitTest。

使用containsPoint判断被点击的图层

<pre>import UIKit

class ViewController: UIViewController {

var layerView: UIView!
var blueLayer: CALayer!
override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.gray
    self.initBlueLayer()
}

func initBlueLayer()
{
    self.layerView = UIView()
    self.layerView.backgroundColor = UIColor.white
    self.layerView.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
    self.view.addSubview(self.layerView)

    self.blueLayer = CALayer()
    
    self.blueLayer.frame = CGRect(x: 20, y: 20, width: 160, height: 160)
    self.blueLayer.backgroundColor = UIColor.blue.cgColor
    self.layerView.layer.addSublayer(self.blueLayer)     
}    
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
    
    let touch = touches.first! as UITouch
    var point = touch.location(in: self.view)
    
    point = self.layerView.layer.convert(point, from: self.view.layer)
    
    if self.layerView.layer.contains(point)
    {
        point = self.blueLayer.convert(point, from: self.layerView.layer)
        
        if self.blueLayer.contains(point)
        {
            print("Inside Blue Layer")
        
        }else
        {
            print("Inside White layer")
        
        }
    }
}</pre>

点击蓝色区域打印:Inside Blue Layer
点击白色区域打印:Inside White layer

使用hitTest判断被点击的图层

<pre>import UIKit

class ViewController: UIViewController {

var layerView: UIView!
var blueLayer: CALayer!
override func viewDidLoad() {
    super.viewDidLoad()
    
    self.view.backgroundColor = UIColor.gray
    self.initBlueLayer()
}

func initBlueLayer()
{
    self.layerView = UIView()
    self.layerView.backgroundColor = UIColor.white
    self.layerView.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
    self.view.addSubview(self.layerView)

    self.blueLayer = CALayer()
    
    self.blueLayer.frame = CGRect(x: 20, y: 20, width: 160, height: 160)
    self.blueLayer.backgroundColor = UIColor.blue.cgColor
    self.layerView.layer.addSublayer(self.blueLayer)
    
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
    
    let touch = touches.first! as UITouch
    let point = touch.location(in: self.view)
    
    let layer = self.layerView.layer.hitTest(point)
    
    if layer == self.blueLayer
    {
         print("Inside Blue Layer")
    
    }else if layer == self.layerView.layer
    {
        print("Inside White layer")
    }else{
    
        print("123")
    
    }
    
}

}

</pre>

点击蓝色区域打印:Inside Blue Layer
点击白色区域打印:Inside White layer

1.png

相关文章

  • Swift CALayer响应点击事件

    CALayer类在概念上和UIView类似,同样也是一些被层级关系树管理的矩形块,同样也可以包含一些像图片,文本或...

  • CALayer响应点击事件

    我们知道CALayer不能直接响应任何响应链事件,所以不能直接处理点击事件。但是依然有两种方法可以帮助我们实现捕捉...

  • Swift touchesBegan 点击空白处响应事件

    Swift touchesBegan 点击空白处响应事件

  • 第二篇:CALayer能力之hitTest响应事件

    目录 一、CALayer hitTest响应事件 二、UIView hitTest+pointInside判断点击...

  • CALayer处理点击事件

    我们知道CALayer不能直接响应任何响应链事件,所以不能直接处理点击事件。但是依然有两种方法可以帮助我们实现捕捉...

  • swift点击事件不响应

    在当前view自定义一个navigationBar时,而且又没隐藏系统的navigationBar,发现自定义na...

  • iOS CALayer 学习

    CALayer简介 CALayer主要是展示内容和动画操作,CALayer不包含在UIKit中,不能响应事件,由于...

  • UIView和CALayer

    1、能否响应事件 UIView继承于UIResponder,具有响应事件的功能 CALayer继承于NSObjec...

  • CALayer解析1:基础属性

    1.CALayer与UIView UIView继承自UIResponder,可以响应触摸事件。CALayer继承自...

  • 图层

    1. UIView和CALayer的区别 CALayer无法响应用户事件NSObject -> CALayerNS...

网友评论

本文标题:Swift CALayer响应点击事件

本文链接:https://www.haomeiwen.com/subject/lusuuttx.html