2010-06-28 7 views
19

UIButton in UIScrollView wird nicht beim Tippen ausgelöst. Bitte helfen Sie es zu lösen.UIButton in UIScrollView wird nicht durch Tippen ausgelöst

// Add a button 
UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; 
btn1.frame = CGRectMake(0, 0, 26, 18); 
btn1.bounds = CGRectMake(0, 0, 30.0, 30.0); 
[btn1 addTarget:self action:@selector(buttonClick1:) 
         forControlEvents:UIControlEventTouchUpInside]; 
[scrollView addSubview:btn1]; 


- (void)buttonClick1:(id)sender { 
    int dd = 4; 
} 
+0

Überprüfen Sie die Höhe oder Breite der scrollView, um zu sehen, ob es 0 ist, und aktivieren Sie 'clipSubview' – onmyway133

Antwort

15

fand ich dieses Zeug:

Aber die Scrollview wird die berührt von der Taste sperren, wenn Sie userInteractionEnabled und exclusiveTouch Eigenschaften festgelegt auf der Scroll auf NO. Aber das würde den Zweck des Habens einer scrollview innerhalb eines Knopfes besiegen, denke ich.

(Siehe Can we put a UIButton in a UIScrollView and vice versa in iPhone)

Aber wie es zu tun?

Sagen Sie bitte eine UIScrollView * sv haben ... dann

sv.userInteractionEnabled = YES; 
sv.exclusiveTouch = YES; 

würde ich auch hinzufügen

sv.canCancelContentTouches = YES; 
sv.delaysContentTouches = YES; 
+0

Es funktioniert !!! Danke, Max. – echo

+0

canCancelContentTouches und delaysContentTouches sind standardmäßig YES. ;) – Andy

+9

Funktioniert bei iOS 7 nicht für mich. –

10

Sie Inhalt Größe Ihrer Ansicht einstellen müssen. Das muss größer oder gleich der Inhaltsgröße von scrollView sein.

Da die Standardgröße Ihrer Ansicht 320 x 480 (3,5 "Retina) und 320 x 568 (4" Retina) ist. So zunehmender Höhe der Ansicht als:

self.view.frame=CGRectMake(0, 0, 320, 700); 

Dann Zugabe dies als Subview Ihrer Scroll werden Sie auf die Lösung.

6

ALTE ANTWORT: Alles, was ich in iOS zu tun hatte 7

gesetzt wurde
[_scrollView setDelaysContentTouches:NO]; 

UPDATE: Nach einer wenig mehr Forschung zu tun scheint es, dass, wenn Ihr Problem ist, dass der UIButton Klick scheint nur zu genannt manchmal, dann ist das eigentlich wahrscheinlich das gewünschte Verhalten in einem UIScrollView. A UIScrollView verwendet die Eigenschaft delaysContentTouches, um automatisch festzustellen, ob der Benutzer versucht hat, einen Bildlauf zu starten oder eine Schaltfläche in der Bildlaufansicht zu drücken. Ich würde annehmen, dass es am besten ist, dieses Verhalten nicht auf NO standardmäßig zu ändern, da dies dazu führen wird, dass das Scrollen nicht möglich ist, wenn der Finger des Benutzers über einer Schaltfläche ist.

+0

danke! das verdient viel mehr Aufmerksamkeit !! –

4

ich das gleiche Problem konfrontiert war, was ich tat, war stattdessen die Schaltfläche, um den Behälter Ansicht des Hinzufügens, habe ich es auf die Bildlaufansicht auf der Oberseite des Behälters Ansicht hinzugefügt:

scrollView.insertSubview(buttonA, aboveSubview: containerView) 

Meine Struktur war:

-View 
--ScrollView 
---ContainerView 

Ich hoffe, dass dies jemand helfen könnte.Diese

+0

Würde gerne wissen, warum das eigentlich benötigt wird .. irgendeine Erklärung? Danke für den Tipp, löste mein Problem. – alasker

+0

@alasker, um ehrlich zu sein, ich habe keine Erklärung, aber es macht mich glücklich zu wissen, dass es dir hilft. –

0

hatte ich die gleiche Struktur wie Giovanny Antwort und snapkit verwenden. Mein Problem war, dass mein ContainerView tatsächlich eine Höhe von 0 hatte. Ich konnte dies feststellen, indem ich ClipToBounds = true auf der ContainerView setzte (nichts, das danach als Grenzen gerendert wurde, hatte eine Höhe von 0).

Jegliche Ansicht außerhalb der Grenzen der übergeordneten Ansichten wird nicht in den Ereignissen behandelt.

Meine Lösung war, die ContainerView linken Anker rechts und unten gleich der Ansicht und der oberen gleich der ScrollView (mein ScrollView ist der oberen Offset von meinem Stamm Views).

Verwandte Themen