2012-11-25 15 views
13

Ich habe eine UIButton in eine benutzerdefinierte UIView eingefügt, und die Schaltfläche empfängt keine Berührungsereignisse (sie gelangt nicht in den hervorgehobenen Zustand, mein Problem ist also nicht über die Möglichkeit, einen Touch innerhalb von Handler zu verkabeln). Ich habe versucht, es sowohl in den XIB in Interface Builder zu setzen, als auch versucht, das UIButton programmatisch separat in die UIView einzufügen, beides endete mit keinem Glück. Alle meine Ansichten sind in einem UIScrollView, also ich zuerst, obwohl UIScrollView sie möglicherweise blockiert, also habe ich auch eine Schaltfläche programmatisch genau so hinzugefügt, wie ich meine benutzerdefinierte Ansicht in UIScrollView hinzugefügt, und die Schaltfläche funktionierte, Eliminierung der Möglichkeit von UIScrollView könnte sei die Ursache. Meine Ansicht ist hiearchy ist wie folgt:UIButton in UIView reagiert nicht auf Berührungsereignisse

ss

Die Taste auf dem Bild Ansicht ist, und die vordere Schicht ist meine Taste nicht vollständig belegt, so gibt es keinen Grund für mich nicht physisch mit der Taste interagiert werden. In meinem eigenen Code Seite ist der Ansicht, Ich schaffe meine Ansicht als solche:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0]; 
     [self addSubview:sub]; 
     [sub setUserInteractionEnabled:YES]; 
     [self setUserInteractionEnabled:YES]; 
     CALayer *layer = sub.layer; 
     layer.masksToBounds = YES; 
     layer.borderWidth = 5.0; 
     layer.borderColor = [UIColor whiteColor].CGColor; 
     layer.cornerRadius = 30.0; 
     /*layer.shadowOffset = CGSizeZero; 
     layer.shadowRadius = 20.0; 
     layer.shadowColor = [[UIColor blackColor] CGColor]; 
     layer.shadowOpacity = 0.8; 
     */ 
    } 
    return self; 
} 

ich alle Kombinationen von setUserInteractionsEnabled ausprobiert habe, und hatte kein Glück. (Ja, setzen Sie sie auch in Interface Builder). Ich habe auch in einer anderen Frage mit einem ähnlichen Problem gelesen, dass ich versuchen sollte "canBecomFirstResponder" zu überschreiben, um "JA" zurückzugeben, und ich habe auch das auch getan. Aber das Problem besteht weiterhin, ich kann nicht auf den Knopf klicken. Ich habe keine besonderen Eigenschaften, Einstellungen auf den Knopf, es ist nur eine regelmäßige. Meine anderen Objekte in der Ansicht (Beschriftung unten, Bildansicht hinter der Schaltfläche usw.) funktionieren problemlos. Was könnte hier möglicherweise falsch sein?

Danke,

Kann.

UPDATE: Hier ist eine schnelle Reproduktion des Problems: https://dl.dropbox.com/u/79632924/Test.zip Versuchen zu laufen und auf die Schaltfläche klicken.

+0

könnten Sie diese Ansicht in ein kleines Testprojekt extrahieren? –

+0

Dumme Frage: Haben Sie daran gedacht, den Button mit IBAction zu verknüpfen? –

+0

@HotLicks ja, sie sind verknüpft. Das Problem besteht jedoch nicht darin, dass der Ereignishandler bei Berührung nicht ausgelöst wird. Das Problem besteht darin, dass der Button überhaupt keine Berührungsereignisse empfängt (oder zumindest auf diese reagiert). –

Antwort

18

Mit Blick auf dem Testprojekt, I glauben Sie Ihr Problem in der Art und Weise, wie Sie TestView erstellen, geben Sie nicht den Rahmen dafür an, also ist die übergeordnete Ansicht grundsätzlich 0, und die von XIB ausgehenden Subviews erstrecken sich aus der übergeordneten Ansicht heraus und erhalten somit nichts in der Antwortkette .

Sie sollten entweder den Rahmen beim Erstellen von TestView angeben oder den Rahmen nach dem Laden der XIB-Datei anpassen.

+0

ja, nur nach dem Hochladen des Testprojekts, es war viel einfacher zu sehen (da es viel weniger Dinge im Testprojekt gab). Jetzt funktionieren meine Knöpfe wie ein Zauber! –

2

Ich habe die Lösung gefunden. Ich war die Initialisierung meiner benutzerdefinierte Ansicht als:

MyView *view = [[MyView alloc] init]; 

ich es stattdessen mit einem Rahmen aus meiner Sicht der Größe initialisiert habe, und es begann zu Ereignissen zu reagieren:

CGRect rect = CGRectMake(0,0,width,height); 
MyView *view = [[MyView alloc] initWithFrame:rect]; 
5

Ich hatte dieses Problem auch. Die Ursache für mich war, dass der Superview-Frame UIButton von der Höhe 0 war, also glaube ich, dass, obwohl eine Berührung stattfand, sie nicht an den Button weitergegeben wurde.

Nachdem sichergestellt wurde, dass die Superansicht der Schaltfläche ein größeres Rechteck als Rahmen angenommen hat, funktionierten die Schaltflächenaktionen.

Die Ursache für dieses Problem auf meiner Seite war eine fehlerhafte Auto-Layout-Implementierung (ich habe vergessen, die Höhe Einschränkung für die Schaltfläche Superview).

Verwandte Themen