我目前正在學習如何實現自定義控件。我不可避免地偶然發現了CALayer的可能性,因爲當需要執行復雜的動畫時,使用UIImage並不夠靈活。我想使用UIView作爲CALayer的「容器」,以使它的寬度和高度總是與UIView相同(爲了靈活性)。Swift中的自定義UI元素:繼承CALayer並重寫drawInContext結果pixelated drawing
我分類了CALayer並覆蓋了drawInContext()方法。
這裏是我得到屏幕上的結果:
圖紙看起來像素化和模糊。我正在使用PaintCode爲我生成繪圖代碼。
這裏的自定義CALayer的:
class SegmentActive: CALayer {
func frameSetup() -> CGRect {
let frameWidth:CGFloat = superlayer.frame.width
let frameHeight:CGFloat = superlayer.frame.height
let frame = CGRectMake(0, 0, frameWidth, frameHeight)
println("\(superlayer.frame.width) // \(superlayer.frame.height)")
return frame
}
override func drawInContext(ctx: CGContext!) {
UIGraphicsPushContext(ctx)
CalorieCalculatorUI.drawSegControlActiveBase(frameSetup())
UIGraphicsPopContext()
}
}
下面是我如何使用它:
class ViewController: UIViewController {
@IBOutlet weak var leftSegmentUIView: UIView!
override func viewDidLoad() {
let activeSegment:SegmentActive = SegmentActive()
leftSegmentUIView.layer.addSublayer(activeSegment)
activeSegment.frame = activeSegment.frameSetup()
activeSegment.setNeedsDisplay()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我在做什麼錯在這裏? :(
非常感謝David!你是一個絕對的傳奇!你的答案和博客總是充滿知識和智慧。再次 - 謝謝你,先生! – 2014-09-21 12:40:53
確實。就FTR而言,一個常見的,類似的相關問題是,當你(比如說)動畫這樣的東西的大小時,你需要self.layer.shouldRasterize = YES; – Fattie 2014-09-21 12:46:15
嘿@JoeBlow,謝謝!我確實計劃製作很多東西,所以我相信這會派上用場。 – 2014-09-21 13:10:18