LoginSignup
4
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-04

市松模様を表示するするカスタム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)
    }
}
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2