天天看點

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

CALayer 判斷是否點選hitTest

CALayer并不關心任何響應鍊事件,是以不能直接處理觸摸事件或者手勢。但是它有一系列的方法幫你處理事件:

containsPoint:

hitTest:

下來看看這兩個方法怎麼使用 。

首先來看

containsPoint

, 首先在界面上拖一個UIView出來 , 在上面放兩份layer 。

ly1.frame = CGRectMake(, , , )
        ly1.backgroundColor = UIColor.redColor().CGColor
        v1.layer.addSublayer(ly1)


        ly2.frame = CGRectMake(, , , )
        ly2.backgroundColor = UIColor.redColor().CGColor
        v1.layer.addSublayer(ly2)
           

大概就這樣的

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

然後重寫

touchesBegan

方法

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        var p = (touches as NSSet).anyObject()?.locationInView(v1);
        p = v1.layer.convertPoint(p!, fromLayer: v1.layer)

        //方法
        if v1.layer.containsPoint(p!) {
            p = ly1.convertPoint(p!, fromLayer: v1.layer)
            if ly1.containsPoint(p!){
               let alert = UIAlertView(title: "點選了", message: "第一個被點選了", delegate: nil, cancelButtonTitle: "OK")
                alert.show()
            }

            p = ly2.convertPoint(p!, fromLayer: v1.layer)
            if ly2.containsPoint(p!){
                let alert = UIAlertView(title: "點選了", message: "第二個被點選了", delegate: nil, cancelButtonTitle: "OK")
                alert.show()
            }

        }
 }
           

效果:

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

就這樣的效果 , 别的Layer 可以暫時不管

hitTest

方法

//方法2
        let p1 = (touches as NSSet).anyObject()?.locationInView(self.v1);
        //p1 = v1.layer.convertPoint(p1!, fromLayer: v1.layer)
        let clickLayer = ly3.hitTest(p1!)
        print(ly3.frame)
        if(clickLayer == ly3){
            let alert = UIAlertView(title: "點選了", message: "第三個被點選了", delegate: nil, cancelButtonTitle: "OK")
            alert.show()
        }

        let anoLayer = ly4.hitTest(p1!)
        if(anoLayer == ly4){
            let alert = UIAlertView(title: "點選了", message: "點選了小鳥", delegate: nil, cancelButtonTitle: "OK")
            alert.show()
        }
           

這個方法友善多了,代碼量少多了 , 以後就用這個了。。。

看看效果

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

contensRect

前面講過者個屬性是用來裁剪圖檔的 , 用一個示例來看看這個屬性的用法

這個圖

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

先在界面上拖寫view

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

拖到控制器

@IBOutlet var digitViews: [UIView]!
           

一個數組 。

img = UIImage(named: "sz")!
        for item in digitViews{
            item.layer.contents = UIImage(named: "sz")!.CGImage
            item.layer.contentsRect = CGRectMake(, , , );
            item.layer.contentsGravity = kCAGravityResizeAspect;
        }


       let timer = NSTimer.scheduledTimerWithTimeInterval(, target: self, selector: "showTime", userInfo: nil, repeats: true)
timer.fire()
           
func showTime(){

        let calendar = NSCalendar.currentCalendar()
//        let unitFlags =
        let comp = calendar.components(NSCalendarUnit.Second , fromDate: NSDate())

        setDigit(comp.second%,ly: digitViews[])
        setDigit(comp.second/, ly: digitViews[])

        let comp1 = calendar.components(NSCalendarUnit.Minute , fromDate: NSDate())
        setDigit(comp1.minute%,ly: digitViews[])
        setDigit(comp1.minute/, ly: digitViews[])

        let comp2 = calendar.components(NSCalendarUnit.Hour , fromDate: NSDate())
        setDigit(comp2.hour%,ly: digitViews[])
        setDigit(comp2.hour/, ly: digitViews[])
    }
           
func setDigit(t:Int,ly:UIView){

        ly.layer.contentsRect = CGRectMake(*CGFloat(t),,, );
    }
           

效果大家也看到了 , 就是上面圖下面的那個電子表

swift詳解之二十六-----------CALayer 判斷是否點選hitTest 和 contensRect

源代碼:https://github.com/smalldu/SwiftStudy

學習iOS,有他就夠了,小碼哥視訊,傳智、黑馬、各種swift書籍