ここではUILabel
サブクラスで、長押しでUIMenuController
を表示します。また、ユースケース用のメニューコントローラを追加することもできます。このことからお持ち帰りする
import UIKit
class MenuLabel: UILabel {
override var canBecomeFirstResponder: Bool {
return true
}
// MARK: - Init
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
isUserInteractionEnabled = true
addGestureRecognizer(
UILongPressGestureRecognizer(
target: self,
action: #selector(handleLongPressed(_:))
)
)
}
// MARK: - Actions
internal func handleLongPressed(_ gesture: UILongPressGestureRecognizer) {
guard let gestureView = gesture.view, let superView = gestureView.superview else {
return
}
let menuController = UIMenuController.shared
guard !menuController.isMenuVisible, gestureView.canBecomeFirstResponder else {
return
}
gestureView.becomeFirstResponder()
menuController.menuItems = [
UIMenuItem(
title: "Custom Item",
action: #selector(handleCustomAction(_:))
),
UIMenuItem(
title: "Copy",
action: #selector(handleCopyAction(_:))
)
]
menuController.setTargetRect(gestureView.frame, in: superView)
menuController.setMenuVisible(true, animated: true)
}
internal func handleCustomAction(_ controller: UIMenuController) {
print("Custom action!")
}
internal func handleCopyAction(_ controller: UIMenuController) {
UIPasteboard.general.string = text ?? ""
}
}
主なものは以下のとおりです。
- はラベルが長押しハンドラで
gestureView.becomeFirstResponder()
を呼び出して、真
- から
canBecomeFirstResponder
isUserInteractionEnabled
セットが上書きされます確認して
このラベルをInterface Builderに追加することも、コードで作成することもできます。
希望すると便利です。
これを実現するためにカスタムを行う必要はありません –
必ずしもそうではありません...私はあなたのコード例で答えに取り組んでいます。 –
@DonovanKing私の助けのためにここにお会いしてうれしい – Krunal