iOS
Swift
swift4

[Swift] UIImageViewで市松模様 [iOS]

市松模様を表示するするカスタムUIImageViewのサンプル

CoreImageのCIFilterを使用。

市松模様の図

市松模様プロパティの画像

CIImageからUIImageを作成してUIImageViewで表示してしまったが、UIViewでdrawをoverrideしてCIImageを直接に描画したほうが速くてシンプルになりそう?(興味があれば誰か頼む。。。)

元ネタ
チェック柄(市松模様)を描画するカスタムView

元ネタのコメント欄にある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)
    }
}