✏️

【Swift】スクリブル(手書き)を制御する

2022/03/12に公開

iPadOS14からApple Pencilで手書きができます。
この手書き入力機能のことをスクリブルと言います。
そしてTextFieldを実装した場合、この手書きができる範囲はパーツ自体より少し広いエリアが取られています。
画像

例えば上記のようにTextFieldの真横にボタンがあった場合、ボタン左端の方は手書きができる範囲のため、ユーザーがApple Pencilでボタンをタップしようとしたら字を書いてしまうということが起こり得ます。

手書きできる領域をぴったりTextField内だけに制御するには、UIScribbleInteractionDelegateが持つscribbleInteraction(_:shouldBeginAt:)で指定することで実現できます。

import UIKit

class ViewController: UIViewController, UIScribbleInteractionDelegate {
    @IBOutlet weak var textField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        textField.addInteraction(UIScribbleInteraction(delegate: self))
        
    }

    func scribbleInteraction(_ interaction: UIScribbleInteraction, shouldBeginAt location: CGPoint) -> Bool {
        if textField.bounds.contains(location) {
            return true
        }
        return false
    }
}

上記サンプルコードではscribbleInteraction(_:shouldBeginAt:)メソッドで、タップした点がTextFieldの領域に含まれているかをチェックしています。
falseを返せば手書き不可、trueを返せば手書きができます。

以下のように書くことで手書きが無効になります。

func scribbleInteraction(_ interaction: UIScribbleInteraction, shouldBeginAt location: CGPoint) -> Bool {
    return false
}

参考

https://developer.apple.com/documentation/uikit/uiscribbleinteractiondelegate/3566752-scribbleinteraction
https://pspdfkit.com/blog/2020/extending-the-scribble-user-experience/

Discussion