ios - titel - wordpress title tag ändern




Wie fügt man einem UIView ein Berührungsereignis hinzu? (8)

Wie füge ich ein Touch-Ereignis zu einer UIView hinzu?
Ich versuche:

UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'

Ich möchte keine Unterklasse erstellen und überschreiben

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

Gestenerkenner

Es gibt eine Reihe von häufig verwendeten Berührungsereignissen (oder Gesten), über die Sie benachrichtigt werden können, wenn Sie Ihrer Ansicht einen Gestenerkenner hinzufügen. Die folgenden Gestenarten werden standardmäßig unterstützt:

  • UITapGestureRecognizer ( Tippen Sie kurz oder mehrmals auf den Bildschirm)
  • UILongPressGestureRecognizer Lange Berührung (lange auf den Bildschirm UILongPressGestureRecognizer )
  • UIPanGestureRecognizer Pan (bewegt den Finger über den Bildschirm)
  • UISwipeGestureRecognizer Swipe (Finger schnell bewegen)
  • UIPinchGestureRecognizer (bewegt zwei Finger zusammen oder auseinander - normalerweise zum Zoomen)
  • UIRotationGestureRecognizer Drehen (zwei Finger in einer kreisförmigen Richtung bewegen)

Darüber hinaus können Sie auch eigene benutzerdefinierte Gestenerkenner erstellen.

Hinzufügen einer Geste im Interface Builder

Ziehen Sie einen Gestenerkenner aus der Objektbibliothek in Ihre Ansicht.

Steuern Sie den Mauszeiger von der Geste in der Dokumentenübersicht auf den View-Controller-Code, um ein Outlet und eine Aktion zu erstellen.

Dies sollte standardmäßig festgelegt werden, stellen Sie aber auch sicher, dass Benutzeraktion aktiviert für Ihre Ansicht auf True festgelegt ist.

Programmgesteuertes Hinzufügen einer Geste

Um eine Geste programmgesteuert hinzuzufügen, erstellen Sie (1) einen Gestenerkenner, (2) fügen Sie ihn einer Ansicht hinzu und (3) erstellen Sie eine Methode, die aufgerufen wird, wenn die Geste erkannt wird.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var myView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. create a gesture recognizer (tap gesture)
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))

        // 2. add the gesture recognizer to a view
        myView.addGestureRecognizer(tapGesture)
    }

    // 3. this method is called when a tap is recognized
    @objc func handleTap(sender: UITapGestureRecognizer) {
        print("tap")
    }
}

Anmerkungen

  • Der sender ist optional. Wenn Sie keinen Hinweis auf die Geste benötigen, können Sie sie weglassen. Wenn Sie dies jedoch tun, entfernen Sie den (sender:) nach dem Namen der Aktionsmethode.
  • Die Benennung der Methode handleTap war beliebig. action: #selector( someMethodName (sender:)) Sie es mit Hilfe der folgenden action: #selector( someMethodName (sender:)) .

Mehr Beispiele

Sie können die Gestenerkenner untersuchen, die ich diesen Ansichten hinzugefügt habe, um zu sehen, wie sie funktionieren.

Hier ist der Code für dieses Projekt:

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var tapView: UIView!
    @IBOutlet weak var doubleTapView: UIView!
    @IBOutlet weak var longPressView: UIView!
    @IBOutlet weak var panView: UIView!
    @IBOutlet weak var swipeView: UIView!
    @IBOutlet weak var pinchView: UIView!
    @IBOutlet weak var rotateView: UIView!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Tap
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        tapView.addGestureRecognizer(tapGesture)

        // Double Tap
        let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
        doubleTapGesture.numberOfTapsRequired = 2
        doubleTapView.addGestureRecognizer(doubleTapGesture)

        // Long Press
        let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(gesture:)))
        longPressView.addGestureRecognizer(longPressGesture)

        // Pan
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(gesture:)))
        panView.addGestureRecognizer(panGesture)

        // Swipe (right and left)
        let swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
        let swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipe(gesture:)))
        swipeRightGesture.direction = UISwipeGestureRecognizerDirection.right
        swipeLeftGesture.direction = UISwipeGestureRecognizerDirection.left
        swipeView.addGestureRecognizer(swipeRightGesture)
        swipeView.addGestureRecognizer(swipeLeftGesture)

        // Pinch
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(gesture:)))
        pinchView.addGestureRecognizer(pinchGesture)

        // Rotate
        let rotateGesture = UIRotationGestureRecognizer(target: self, action: #selector(handleRotate(gesture:)))
        rotateView.addGestureRecognizer(rotateGesture)

    }

    // Tap action
    @objc func handleTap() {
        label.text = "Tap recognized"

        // example task: change background color
        if tapView.backgroundColor == UIColor.blue {
            tapView.backgroundColor = UIColor.red
        } else {
            tapView.backgroundColor = UIColor.blue
        }

    }

    // Double tap action
    @objc func handleDoubleTap() {
        label.text = "Double tap recognized"

        // example task: change background color
        if doubleTapView.backgroundColor == UIColor.yellow {
            doubleTapView.backgroundColor = UIColor.green
        } else {
            doubleTapView.backgroundColor = UIColor.yellow
        }
    }

    // Long press action
    @objc func handleLongPress(gesture: UILongPressGestureRecognizer) {
        label.text = "Long press recognized"

        // example task: show an alert
        if gesture.state == UIGestureRecognizerState.began {
            let alert = UIAlertController(title: "Long Press", message: "Can I help you?", preferredStyle: UIAlertControllerStyle.alert)
            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
            self.present(alert, animated: true, completion: nil)
        }
    }

    // Pan action
    @objc func handlePan(gesture: UIPanGestureRecognizer) {
        label.text = "Pan recognized"

        // example task: drag view
        let location = gesture.location(in: view) // root view
        panView.center = location
    }

    // Swipe action
    @objc func handleSwipe(gesture: UISwipeGestureRecognizer) {
        label.text = "Swipe recognized"

        // example task: animate view off screen
        let originalLocation = swipeView.center
        if gesture.direction == UISwipeGestureRecognizerDirection.right {
            UIView.animate(withDuration: 0.5, animations: {
                self.swipeView.center.x += self.view.bounds.width
            }, completion: { (value: Bool) in
                self.swipeView.center = originalLocation
            })
        } else if gesture.direction == UISwipeGestureRecognizerDirection.left {
            UIView.animate(withDuration: 0.5, animations: {
                self.swipeView.center.x -= self.view.bounds.width
            }, completion: { (value: Bool) in
                self.swipeView.center = originalLocation
            })
        }
    }

    // Pinch action
    @objc func handlePinch(gesture: UIPinchGestureRecognizer) {
        label.text = "Pinch recognized"

        if gesture.state == UIGestureRecognizerState.changed {
            let transform = CGAffineTransform(scaleX: gesture.scale, y: gesture.scale)
            pinchView.transform = transform
        }
    }

    // Rotate action
    @objc func handleRotate(gesture: UIRotationGestureRecognizer) {
        label.text = "Rotate recognized"

        if gesture.state == UIGestureRecognizerState.changed {
            let transform = CGAffineTransform(rotationAngle: gesture.rotation)
            rotateView.transform = transform
        }
    }
}

Anmerkungen

  • Sie können einer einzigen Ansicht mehrere Gestenerkenner hinzufügen. Der Einfachheit halber habe ich das jedoch nicht gemacht (außer für die Wischgeste). Wenn Sie für Ihr Projekt benötigen, sollten Sie die Dokumentation zur Gestenerkennung lesen. Es ist ziemlich verständlich und hilfreich.
  • Bekannte Probleme mit meinen obigen Beispielen: (1) Die Pan-Ansicht setzt ihren Frame beim nächsten Gestenereignis zurück. (2) Die Swipe-Ansicht kommt beim ersten Swipe aus der falschen Richtung. (Diese Fehler in meinen Beispielen sollten jedoch nicht Ihr Verständnis davon beeinflussen, wie Gestenerkenner funktionieren.)

Basierend auf der akzeptierten Antwort können Sie ein Makro definieren:

#define handle_tap(view, delegate, selector) do {\
    view.userInteractionEnabled = YES;\
    [view addGestureRecognizer: [[UITapGestureRecognizer alloc] initWithTarget:delegate action:selector]];\
} while(0)

Dieses Makro verwendet ARC, daher gibt es keinen release .

Makro Verwendungsbeispiel:

handle_tap(userpic, self, @selector(onTapUserpic:));

Erstellen Sie eine Gestenerkennung (Unterklasse), die Berührungsereignisse wie touchesBegan . Sie können es danach zur Ansicht hinzufügen.

Auf diese Weise verwenden Sie die Komposition statt der Unterklasse (was die Anfrage war).


Heres eine schnelle Version:

// MARK: Gesture Extensions
extension UIView {

    func addTapGesture(#tapNumber: Int, target: AnyObject, action: Selector) {
        let tap = UITapGestureRecognizer (target: target, action: action)
        tap.numberOfTapsRequired = tapNumber
        addGestureRecognizer(tap)
        userInteractionEnabled = true
    }

    func addTapGesture(#tapNumber: Int, action: ((UITapGestureRecognizer)->())?) {
        let tap = BlockTap (tapCount: tapNumber, fingerCount: 1, action: action)
        addGestureRecognizer(tap)
        userInteractionEnabled = true
    }
}

Ich denke du kannst es einfach benutzen

UIControl *headerView = ...
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];

Ich meine HeaderView erstreckt sich von UIControl.


In iOS 3.2 und höher können Sie Gestenerkenner verwenden. So würden Sie beispielsweise ein Tap-Ereignis behandeln:

//The setup code (in viewDidLoad in your view controller)
UITapGestureRecognizer *singleFingerTap = 
  [[UITapGestureRecognizer alloc] initWithTarget:self 
                                          action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleFingerTap];

//The event handling method
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
  CGPoint location = [recognizer locationInView:[recognizer.view superview]];

  //Do stuff here...
}

Es gibt auch eine Reihe von eingebauten Gesten. UIGestureRecognizer Sie sich die Dokumentation zur iOS-Ereignisbehandlung und UIGestureRecognizer . Ich habe auch eine Menge Beispielcode auf github , der helfen könnte.


Sie können dies erreichen, indem Sie in Ihrem Code den Gestenerkenner hinzufügen.

Schritt 1: ViewController.m:

// Declare the Gesture.
UITapGestureRecognizer *gesRecognizer = [[UITapGestureRecognizer alloc] 
                                          initWithTarget:self 
                                          action:@selector(handleTap:)];
gesRecognizer.delegate = self;

// Add Gesture to your view.
[yourView addGestureRecognizer:gesRecognizer]; 

Schritt 2: ViewController.m:

// Declare the Gesture Recogniser handler method.
- (void)handleTap:(UITapGestureRecognizer *)gestureRecognizer{
   NSLog(@"Tapped");
}

HINWEIS: Hier war in meinem Fall die @property (strong, nonatomic) IBOutlet UIView *localView;

EDIT: * localView ist das weiße Feld in Main.storyboard von unten


Warum versuchst du nicht SSEventListener ?

Sie müssen keine Gestenerkennung erstellen und Ihre Logik von einer anderen Methode trennen. SSEventListener unterstützt das Festlegen von Listener-Blöcken in einer Ansicht, um auf eine einzelne SSEventListener zu hören, eine Doppeltippgeste und eine N-Tap-Geste, wenn Sie möchten, und eine lange Gestenbetätigung. Das Einstellen eines einzelnen Gesten-Listeners wird folgendermaßen ausgeführt:

[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];





touch