14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iOSのUIKitで覗き穴のようなビューを実現する

Last updated at Posted at 2019-12-16

iOS の UIView で下のスクリーンショットのような覗き穴のようなビューを作る方法です。画像の Cropper ビューなんかを作るときにも必要になりますね。

この完成形のスクリーンショットのビュー構造は

  • スクリーンいっぱいの UIImageView
  • その上に同じサイズの HoleView (今回作るビュー)

というようになっています。

コード

タッチした場所を中心に覗き穴ができるようなコードの例です。
覗き穴の部分の実装は UIView の drawRect(_:CGRect) メソッドをオーバライドしている部分で、やっていることは次のとおりです。簡単ですね。

  • まずビューの全体を塗りつぶす(=穴の外側となる)
  • ブレンドモード .clear を指定して穴の部分を塗りつぶす
HoleView.swift
import UIKit

class HoleView: UIView {
    
    private var holeCenter: CGPoint = .zero
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        
        guard let context = UIGraphicsGetCurrentContext() else { return }
        
        // 全体を塗りつぶす
        UIColor.black.withAlphaComponent(0.75).setFill()
        context.fill(bounds)

        // 穴はブレンドモードで .clear を指定して塗りつぶす
        let holeRect = CGRect(x: holeCenter.x - 100, y: holeCenter.y - 100, width: 200, height: 200)
        context.setBlendMode(.clear)
        context.fillEllipse(in: holeRect)
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        guard let touch = touches.first else { return }
        // タッチした場所を穴の中心とする
        holeCenter = touch.location(in: self)
        setNeedsDisplay()
    }

}

実行結果

いい感じに覗き穴っぽくなりました :thumbsup:

output.gif

14
7
2

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
14
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?