市松模様を表示するするカスタムUIImageViewのサンプル
CoreImageのCIFilterを使用。
CIImageからUIImageを作成してUIImageViewで表示してしまったが、UIViewでdrawをoverrideしてCIImageを直接に描画したほうが速くてシンプルになりそう?(興味があれば誰か頼む。。。)
元ネタのコメント欄にあるCICheckerboardGeneratorを使ってみた。並ぶタイルの個数ではなくて、タイルの長さ指定とした。
import UIKit
@IBDesignable class CheckerImageView : UIImageView {
@IBInspectable var color0 : UIColor = UIColor(red:1.0, green:1.0, blue:1.0, alpha:1.0)
@IBInspectable var color1 : UIColor = UIColor(red:0.0, green:0.0, blue:0.0, alpha:1.0)
@IBInspectable var length : Double = 1.0
var oldSize = CGSize(width: 0.0, height: 0.0)
var oldColor0 : UIColor = UIColor()
var oldColor1 : UIColor = UIColor()
var oldlength : Double = 0.0
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder : aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
putCheckerImage()
}
override func setNeedsDisplay() {
putCheckerImage()
super.setNeedsDisplay()
}
func putCheckerImage() {
if oldSize.equalTo(self.bounds.size)
&& oldlength == length
&& oldColor0 == color0
&& oldColor1 == color1 {
return
}
oldSize = self.bounds.size
oldlength = length
oldColor0 = color0
oldColor1 = color1
self.image = createCheckerImage()
}
func createCheckerImage() -> UIImage? {
guard let filter = CIFilter(name: "CICheckerboardGenerator") else {
assertionFailure()
return nil
}
let size = self.bounds.size
let rect = CGRect(origin: CGPoint.zero, size: size)
filter.setDefaults()
filter.setValue(CIColor(cgColor:color0.cgColor), forKey:"inputColor0")
filter.setValue(CIColor(cgColor:color1.cgColor), forKey:"inputColor1")
filter.setValue(NSNumber(value: length) , forKey: "inputWidth")
filter.setValue(NSNumber(value: 1.0) as NSNumber, forKey: "inputSharpness")
filter.setValue(CIVector(values: [size.width * 0.5, size.height * 0.5], count: 2), forKey: "inputCenter")
guard let outputImage:CIImage = filter.outputImage else {
return nil
}
let cicontext = CIContext(options: nil)
guard let cgimage:CGImage = (cicontext.createCGImage(outputImage, from: rect)) else {
return nil
}
return UIImage(cgImage: cgimage)
}
}