形狀的繪制沒有問題,但我們有時希望能夠處理稍微復雜一些的東西,比如旋轉或拉伸一個形狀。當然可以通過提供不同的坐標來直接創建新的路徑,但要求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()
效果圖: