iOS CoreAnimation(四) anchorPoint锚点是什么

来源:互联网 发布:数据挖掘apriori算法 编辑:程序博客网 时间:2024/04/19 14:02

在了解锚点之前,要知道:

 UIView 有三个重要的布局属性:

frame,bounds,center 

 CALayer对应地叫做:

frame,bounds,position

为了能清楚区分,图层用了“position”,视图用了“center”,但是他们都代表同样的值 。现在不用知道这俩是什么,往下看。

frame:在父图层上占据的空间,包括 x,y,长,宽 

bounds是内部坐标,{0, 0}通常是图层的左上角




anchorPoint 用单位坐标来描述,也就是图层的相对坐标,图层左上角是{0,0},右下角是{1, 1},默认是{0.5, 0.5}可以通过指定xy值小于0或者大于1,使它放置在图层范围之外) 

center 和position都是  anchorPoint 相对于父图层  的位置。 那么anchorPoint 理解成什么呢?

如果你修改了center或 position 属性值,那么由上面那句话的定义, anchorPoint 的绝对位置(在父图层上的位置)会随之改变。但是!它相对于自己这个图层的位置不变,比如 原来是(1,0),不论怎么改position ,还是 (1,0)。那么,要想维持这个值,就必须自动改变frame,来满足锚点的值,也就是相对于图层的位置不变,结果是整个图层的绝对位置变了


那么,如果我修改了 锚点的值呢?

看定义,同理,锚点的position不变,也就是绝对位置不变,而在图层的相对位置变了,图层就必须调整自己位置,适应锚点的值。


锚点有什么用呢???

做个钟表小程序就知道了

首先,想一下,表针要转。我们有3张表针的图片,要让他转也很容易,一个方法就搞定了。

关键是,它转的时候,是以中点为中心转圈对吧?怎么样让他以一端为中心转呢?

锚点就是来解决这个问题的。有的同学可能觉得 表针的图的后半部分是空白不就行了嘛,但是这样会增大内存资源占用

锚点可以看作转动时的轴!!!

通过这段叙述,你应该理解了这个 锚 字的含义,它像是一个图的锚、把柄,demo:

class ViewController:UIViewController,CALayerDelegate {

 //这个用纯代码也可以,不过图多 太麻烦。注意用IB的时候把自动调整、自动布局关了

    @IBOutletweak var board:UIImageView!

    @IBOutletweak var minutePointer:UIImageView!

    @IBOutletweak var hourPointer:UIImageView!

    @IBOutletweak var secondPointer:UIImageView!

//下面秒针下面的时针、分针都被挡住了


    weakvar timer:Timer?


    overridefunc viewDidLoad() {

        super.viewDidLoad()

        

//下面三行先别写,跑一遍,再加上,再跑一遍,理解一下锚点

        hourPointer.layer.anchorPoint = CGPoint(x:0.5, y: 0.95)

        minutePointer.layer.anchorPoint = CGPoint(x:0.5, y: 0.95)

        secondPointer.layer.anchorPoint = CGPoint(x:0.5, y: 0.95)

        

        //每秒出发一次,改指针

        timer = Timer.scheduledTimer(timeInterval:1.0, target: self, selector:#selector(tick), userInfo:nil, repeats: true)

        

        timer!.fire()

       

    }

   

    func tick(){

       //下面一段话是获得当前时、分、秒的,没意思

        let date = Date()

        let formatter = DateFormatter()

        formatter.dateFormat = "HH:mm:ss"

        let dateStr = formatter.string(from: date)

        

        let start2 = dateStr.index(dateStr.startIndex, offsetBy:2)

        

        let hour = Int8(dateStr.substring(to: start2))!

        

        let minite = Int8(dateStr.substring(with: Range(uncheckedBounds: (dateStr.index(start2, offsetBy:1),dateStr.index(start2, offsetBy:3) ) )))!

        let sec = Int8(dateStr.substring(with: Range(uncheckedBounds: (dateStr.index(start2, offsetBy:4),dateStr.index(start2, offsetBy:6) ) )))! - 1

        

        let hAngle = CGFloat.pi*CGFloat(hour)/6

        let mAngle = CGFloat.pi*CGFloat(minite)/30

        let sAngle = CGFloat.pi*CGFloat(sec)/30

        

        minutePointer.transform = CGAffineTransform(rotationAngle: mAngle)

        secondPointer.transform = CGAffineTransform(rotationAngle: sAngle)

        hourPointer.transform = CGAffineTransform(rotationAngle: hAngle)

    }

    第二次跑起来!自己就乖乖的以一头转了!


    

    

}











原创粉丝点击