2010-06-28 12 views
19

UIButton dentro de UIScrollView no se activa al tocar. Por favor ayuda a resolverlo.UIButton dentro de UIScrollView no se activa al tocar

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

Compruebe la altura o el ancho de scrollView para ver si es 0, y habilite 'clipSubview' – onmyway133

Respuesta

15

me encontré con esto:

Pero el ScrollView bloqueará la toques desde el botón a menos que establezca userInteractionEnabled y propiedades exclusiveTouch a NO en el ScrollView. Pero eso vencería el propósito de de tener una vista de desplazamiento dentro de , un botón, creo.

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

Pero cómo hacerlo?

Digamos que tienes una UIScrollView * sv ... entonces

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

También me gustaría añadir

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

¡Funciona! Gracias Max. – echo

+0

canCancelContentTouches y delaysContentTouches son SÍ por defecto. ;) – Andy

+9

No funciona para mí en iOS 7. –

10

debe configurar el tamaño de contenido de su vista. Debe ser mayor o igual que el tamaño de contenido de scrollView.

Dado que el tamaño predeterminado de su vista es 320 x 480 (3.5 "retina) y 320 x 568 (4" retina). Por lo tanto el aumento de altura de vista como:

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

A continuación, añadir esto como la subvista de su ScrollView lo llevará a la solución.

6

vieja respuesta: Todo lo que tenía que hacer en iOS 7 se estableció

[_scrollView setDelaysContentTouches:NO]; 

ACTUALIZACIÓN: Después de hacer un poco más de investigación, parece que si el problema es que el UIButton clic parece solamente ser llamado veces, entonces ese es en realidad probablemente el comportamiento deseado dentro de un UIScrollView. Un UIScrollView utiliza la propiedad delaysContentTouches para determinar automáticamente si el usuario estaba tratando de desplazarse o tratar de presionar un botón dentro de la vista de desplazamiento. Supongo que es mejor no alterar este comportamiento a NO de manera predeterminada, ya que al hacerlo se perderá la capacidad de desplazamiento si el dedo del usuario está sobre un botón.

+0

¡gracias! esto merece mucha más atención !! –

4

que estaba frente a este mismo problema, lo que hice fue en lugar de añadir el botón a la vista de contenedor, he añadido a la vista de desplazamiento en la parte superior de la vista de contenedor:

scrollView.insertSubview(buttonA, aboveSubview: containerView) 

Mi estructura fue:

-View 
--ScrollView 
---ContainerView 

Espero que esto pueda ser de ayuda para cualquiera.

+0

Me encantaría saber por qué esto es realmente necesario ... ¿alguna explicación? Gracias por la sugerencia, resolvió mi problema. – alasker

+0

@alasker, para ser sincero, no tengo una explicación, pero me alegra saber que te puede ayudar. –

0

que tenían la misma estructura que la respuesta de Giovanny y estoy usando snapkit. Mi problema era que mi ContainerView realmente tenía una altura de 0. Pude notar esto configurando ClipsToBounds = true en el ContainerView (nada representado después de hacer esto ya que los límites tenían una altura de 0).

Cualquier vista fuera de los límites de vistas principales no recibirá el retoque dentro de los eventos.

Mi solución consistía en establecer los anclajes izquierdo y derecho de ContainerView iguales a la vista y la parte superior igual a ScrollView (la parte superior de mi ScrollView está desviada de mi vista raíz).

Cuestiones relacionadas