您的位置:首页 > 移动开发 > IOS开发

iOS CoreAnimation(四) anchorPoint锚点是什么

2017-06-05 22:03 656 查看
在了解锚点之前,要知道:

 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}。(可以通过指定x和y值小于0或者大于1,使它放置在图层范围之外) 

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

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

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

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



锚点有什么用呢???

做个钟表小程序就知道了

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

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

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

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

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

class ViewController:
UIViewController,CALayerDelegate {

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

    @IBOutlet
weak var board:
UIImageView!

    @IBOutlet
weak var minutePointer:
UIImageView!

    @IBOutlet
weak var hourPointer:
UIImageView!

    @IBOutlet
weak var secondPointer:
UIImageView!

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



    weak
var timer:Timer?

    override
func 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),dat
baad
eStr.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)

    }

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



    

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息