在iOS上实现变换

  形状的绘制没有问题,但我们有时希望能够处理稍微复杂一些的东西,比如旋转或拉伸一个形状。当然可以通过提供不同的坐标来直接创建新的路径,但要求iOS替我们完成旋转通常会更好一些。

  为此,我们使用变换,变换就是变换矩阵的表示,通常可以对内容进行任何形式的变形和操控。

  无论你的代码进行什么样的绘制操作,都会受到道歉转换矩阵(CTM)的影响,它会对每条路径及所执行的绘制操作进行变换。默认情况下,变换矩阵是单位矩阵,也就是说它不做任何工作。但是,可以修改CTM以影响绘制过程。

  要修改CTM,首先要对低级绘制上下文的引用。这个上下文是在调用drawRect(rect:)方法之前由Cocoa为你设置的,它是CGContextRef类型。在iOS上,可以用以下代码获取此上下文:

var context = UIGraphicsGetCurrentContext()

  有了上下文,就可以修改CTM了。在下面的例子中,我们将修改CTM,使绘制出来的所有内容都围绕原点旋转一定的角度。

 说明:如果修改了CTM,这一变化将一直持续到恢复上下文的状态为止。如果只需要旋转部分绘制内容,应当在修改CTM之前保存上下文的状态,在完成旋转之后恢复状态。

代码如下:

//: Playground - noun: a place where people can play

import UIKit

class MyView : UIView{
    override func drawRect(rect: CGRect) {
        var pathRect = CGRectInset(self.bounds, self.bounds.size.width*0.1, self.bounds.size.height*0.1)
        let cornerRadius : CGFloat = 20.0
        
        var rotationTransform = CGAffineTransformMakeRotation(CGFloat(M_PI)/4.0)
        
        var rectanglePath = UIBezierPath(roundedRect: pathRect, cornerRadius: cornerRadius)
        
        var context = UIGraphicsGetCurrentContext()
        
        CGContextSaveGState(context)
        
        CGContextConcatCTM(context, rotationTransform)
        
        UIColor.redColor().setFill()
        rectanglePath.fill()
        
        CGContextRestoreGState(context)
    }
}

let viewRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let myEmptyView = MyView(frame:viewRect)
myEmptyView.backgroundColor = UIColor.clearColor()

  效果图:

posted @ 2016-04-07 19:04  torrescx  阅读(247)  评论(0编辑  收藏  举报