UILabelをクリック可能にしたいのですが。
私はこれを試しましたが、うまくいきません。
class DetailViewController: UIViewController {
@IBOutlet weak var tripDetails: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
...
let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
tripDetails.addGestureRecognizer(tap)
}
func tapFunction(sender:UITapGestureRecognizer) {
print("tap working")
}
}
isUserInteractionEnabled
ラベルでtrue
をtripDetails
に設定しようとしましたか?これでうまくいくはずです。
Swift 3 Update
交換する
Selector("tapFunction:")
と
#selector(DetailViewController.tapFunction)
例:
class DetailViewController: UIViewController {
@IBOutlet weak var tripDetails: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
...
let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
tripDetails.isUserInteractionEnabled = true
tripDetails.addGestureRecognizer(tap)
}
@objc
func tapFunction(sender:UITapGestureRecognizer) {
print("tap working")
}
}
Swift 4 Update
@IBOutlet weak var tripDetails: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
tripDetails.isUserInteractionEnabled = true
tripDetails.addGestureRecognizer(tap)
}
@objc func tapFunction(sender:UITapGestureRecognizer) {
print("tap working")
}
Swift 3 Update
yourLabel.isUserInteractionEnabled = true
Swift 5
@liorcoに似ていますが、@ objcを@ IBActionに置き換える必要があります。
class DetailViewController: UIViewController {
@IBOutlet weak var tripDetails: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
...
let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
tripDetails.isUserInteractionEnabled = true
tripDetails.addGestureRecognizer(tap)
}
@IBAction func tapFunction(sender: UITapGestureRecognizer) {
print("tap working")
}
}
これはXcode 10.2で機能しています。
良くて便利な解決策:
あなたのViewControllerで:
@IBOutlet weak var label: LabelButton!
override func viewDidLoad() {
super.viewDidLoad()
self.label.onClick = {
// TODO
}
}
ViewControllerまたは別の.Swiftファイル(CustomView.Swiftなど)にこれを配置できます。
@IBDesignable class LabelButton: UILabel {
var onClick: () -> Void = {}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
onClick()
}
}
ストーリーボードで[ラベル]を選択し、フィールドクラスの[IDインスペクタ]の右側のペインでLabelButtonを選択します。
Label Attribute Inspectorの "User Interaction Enabled"で有効にするのを忘れないでください
そのラベルのユーザーインタラクションを有効にする必要があります.....
例えば
yourLabel.userInteractionEnabled = true
Swift 3.0の場合ジェスチャーの長押し時間も変更できます
label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:)))
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)
私のように見落としがちですが、UITapGestureRecognizer
ではなくUIGestureRecognizer
を使用することを忘れないでください。