ios ändern - Wie fügt man einem UIView ein Berührungsereignis hinzu?




einfügen wordpress (11)

Eine andere Möglichkeit besteht darin, der Ansicht eine transparente Schaltfläche hinzuzufügen

UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
b.frame = CGRectMake(0, 0, headerView.width, headerView.height);
[headerView addSubview:b];
[b addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchDown];

Und dann, klicke auf:

- (void)buttonClicked:(id)sender
{}

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

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.


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
    }
}

Schnell 3:

let tapGestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGestureRecognizer(_:)))
view.addGestureRecognizer(tapGestureRecognizer)

func handleTapGestureRecognizer(_ gestureRecognizer: UITapGestureRecognizer) {

}

Swift 3 & Swift 4

import UIKit

extension UIView {

func addTapGesture(tapNumber : Int, target: Any , action : Selector) {

    let tap = UITapGestureRecognizer(target: target, action: action)
    tap.numberOfTapsRequired = tapNumber
    addGestureRecognizer(tap)
    isUserInteractionEnabled = true

  }
}

Benutzen

 yourView.addTapGesture(tapNumber: 1, target: self, action: #selector(yourMethod))

Hier ist ios tapgesture; Zuerst müssen Sie eine Aktion für den GestureRecognizer erstellen, nachdem Sie den folgenden Code unter der Aktion geschrieben haben, wie unten gezeigt

- (IBAction)tapgesture:(id)sender

{


[_password resignFirstResponder];


[_username resignFirstResponder];

NSLog(@" TapGestureRecognizer  tapped");

}

Ich denke du kannst es einfach benutzen

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

Ich meine HeaderView erstreckt sich von UIControl.


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).


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:));

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];


Versuchen Sie, die folgende Zeile hinzuzufügen, um das Problem mit deaktivierten Schaltflächen zu lösen

[menu sendSubviewToBack:pickerView];




ios objective-c events uiview touch