UILabel
には設定可能な値がありますか?UILabelには選択可能な値がありますか?
私はSafariのように、私は選択可能にしたいというラベルを持っています(ロングプレスとコピーbtnが表示されます)。
UILabel
には設定可能な値がありますか?UILabelには選択可能な値がありますか?
私はSafariのように、私は選択可能にしたいというラベルを持っています(ロングプレスとコピーbtnが表示されます)。
はい、あなたのUILabelに適用される長い押しジェスチャからUIMenuControllerを実装する必要があります。 NSHipsterにこれに関する素晴らしい記事がありますが、記事の要点は以下のとおりです。
UILabelのサブクラスを作成し、次のメソッドを実装します。
override func canBecomeFirstResponder() -> Bool {
return true
}
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
return (action == "copy:")
}
// MARK: - UIResponderStandardEditActions
override func copy(sender: AnyObject?) {
UIPasteboard.generalPasteboard().string = text
}
は、その後、あなたのビューコントローラでは、あなたのラベルを長押しジェスチャーを追加することができます。
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
label.addGestureRecognizer(gestureRecognizer)
と長いハンドルこの方法でプレスしてください:
func handleLongPressGesture(recognizer: UIGestureRecognizer) {
if let recognizerView = recognizer.view,
recognizerSuperView = recognizerView.superview
{
let menuController = UIMenuController.sharedMenuController()
menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView)
menuController.setMenuVisible(true, animated:true)
recognizerView.becomeFirstResponder()
}}
注:このコードはt彼NSHipsterの記事、私はそれをSOの準拠のためにここに含めています。
UILabelはUIViewを継承しているため、長いジェスチャ認識機能をラベルに追加するだけです。 isUserInteractionEnabledをtrueに変更する必要があることに注意してください。これは、ラベルがデフォルトでfalseになっているためです。
import UIKit
class ViewController: UIViewController {
let label = UILabel()
override func viewDidLoad() {
view.addSubview(label)
label.text = "hello"
label.translatesAutoresizingMaskIntoConstraints = false
label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressLabel(longPressGestureRecognizer:)))
label.addGestureRecognizer(longPressGestureRecognizer)
label.isUserInteractionEnabled = true
}
@objc private func longPressLabel (longPressGestureRecognizer: UILongPressGestureRecognizer) {
if longPressGestureRecognizer.state == .began {
print("long press began")
} else if longPressGestureRecognizer.state == .ended {
print("long press ended")
}
}
}
http://stephenradford.me/make-uilabel-copyable/ :) – user2636197
私は必要なすべての機能を提供しUILabel
サブクラスを実装しました。インターフェイスビルダーでこれを使用している場合は、init
メソッドを調整する必要があります。
/// A label that can be copied.
class CopyableLabel: UILabel
{
// MARK: - Initialisation
/// Creates a new label.
init()
{
super.init(frame: .zero)
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:)))
self.addGestureRecognizer(gestureRecognizer)
self.isUserInteractionEnabled = true
}
required init?(coder aDecoder: NSCoder)
{
fatalError("init(coder:) has not been implemented")
}
// MARK: - Responder chain
override var canBecomeFirstResponder: Bool
{
return true
}
// MARK: - Actions
/// Method called when a long press is triggered.
func handleLongPressGesture(_ gestuerRecognizer: UILongPressGestureRecognizer)
{
guard let superview = self.superview else { return }
let menuController = UIMenuController.shared
menuController.setTargetRect(self.frame, in: superview)
menuController.setMenuVisible(true, animated:true)
self.becomeFirstResponder()
}
override func copy(_ sender: Any?)
{
UIPasteboard.general.string = self.text
}
}
また、ラベルのユーザー操作を有効にする必要があります。それがなければ、ジェスチャーは決して認識されません。また、handleLongPressGestureメソッドでジェスチャの状態を確認することも重要です。そのNSHipsterの記事は、適切にそれをしないことによってひどい仕事をしています。 – rmaddy
も同様です:) http://stephenradford.me/make-uilabel-copyable/ – user2636197