2009-05-27 13 views
25

Pensé que era inteligente y simplemente puse un UIButton transparente sobre un UIImageView con el tamaño de fotograma exacto, para poder conectarlo fácilmente con cualquier evento que me guste, por ejemplo TouchUpInside, y hacer que llame a un método de acción de una vista controlador cuando el usuario lo toca. Bueno, funciona hasta que alfa está por debajo de 0.1f. Si hago 0.01f, no funcionará. Entonces, para que funcione, cuando mires por largo tiempo a la pantalla, verás que 0.1f de alfa brilla. Y eso es totalmente repugnante;)¿Hay alguna forma de crear un UIButton invisible que aún "esté ahí" y atrape eventos táctiles para mi UIImageView?

Parece que iPhone OS intenta ser inteligente y no detectará eventos en el botón si visualmente no está allí. Alguna idea de como resolver eso?

Claro que podría hacer una subclase de UIImageView e implementar toquesBegan: ... etc., pero no se siente realmente elegante. Quiero decir ... cuando quiero hipervínculo una imagen en la web, nunca me gustaría crear mi propio elemento HTML para esa imagen, solo para conectarlo a una url cuando se hace clic. Eso simplemente no tiene mucho sentido para mí.

Respuesta

41

Debería poder establecer el 'Tipo' del botón en Personalizado en el Creador de interfaz, y no mostrará ningún texto o elementos gráficos sobre el UIImageView. De esta manera, no necesita ajustar el alfa. Si la vista está construida desde código, use:

button = [UIButton buttonWithType:UIButtonTypeCustom]; 
+1

Perfecto! Tenía UIButtonTypeRoundedRect. Ahora no necesito alfa. ¡Buena cosa! – Thanks

+0

Recibo el siguiente error al configurar en UIButtonTypeCustom: "no se puede establecer el objeto, ya sea de propiedad de solo lectura o no se encontró el colocador" –

+0

no, eso no funciona - el tipo es solo para codificar – LordT

1

También creo que puede asignar una imagen a un botón.

La imagen puede ocupar todo el fotograma y tampoco puede tener otros artefactos del buttone si lo configura correctamente.

Comprueba las propiedades

UIButtonInstance.currentImage 

De esa manera no están acaparando los recursos con los elementos que son esencialmente ya allí.

+0

Sería una opción también. Probaré eso. – Thanks

+0

currentImage is readonly. Pero hay un [botón setImage: image forState: UIControlStateNormal]; método. Lo único "malo" de esto es que parece que tengo que proporcionar una imagen para cada estado;) ... tal vez solo elija esa imagen para todos los estados, si no proporciono otra. Lo intentaré. – Thanks

3

Además de UIButtonTypeCustom, puse los colores del texto botón a lo siguiente:

[button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal]; 
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateNormal]; 
[button setTitleColor:[UIColor clearColor] forState:UIControlStateHighlighted]; 
[button setTitleShadowColor:[UIColor clearColor] forState:UIControlStateHighlighted]; 
+0

Esto funcionó para mí. Tenía un ImageView y quería recibir mensajes cuando se presionó la imagen. – netskink

+0

¿Qué le parece configurar el texto: '[button setTitle: @" "forState: UIControlStateNormal];'? –

3

La mejor manera de hacer esto es:

myButton.hidden = YES; 

No se puede utilizar la propiedad debido a ButtonType es una propiedad de solo lectura. La única forma de usarlo es al crear su botón dinámicamente.

+11

No creo que un botón oculto todavía pueda actuar como respondedor. – LordT

+0

+ 1 Esto es lo que estaba buscando, ¡funciona como un encanto! – Pramesh

0

La respuesta anterior de Jasons es casi correcta, pero no es posible establecer el tipo de botón. Así que para crear mediante programación un botón vacío, utilice este código:

UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
myButton.frame=frame; 
[self.view addSubview:myButton]; 
0

Esto es lo que hice, pero con el uso de una subclase de UIButton la que más tarde descubrí no debe ser una subclase de acuerdo con la red. Mi subclase se llamaba Puntos

Puntos * mypoint = [Points buttonWithType: UIButtonTypeCustom];

luego si tiene una imagen que desea agregar al botón: [mypoint setImage: imageNamed: @ "myimage"] forstate: UIControlStateNormal];

si no agrega esta imagen, el botón será invisible para el usuario pero debe responder al tacto. Así es como creé un punto de acceso en my imageView inorder para que responda a la interacción del usuario.

0

Es la única manera que encontré ...

[yourButton setImage:[UIImage imageNamed:@"AnEmptyButtonWithTheSameSize.png"] forState:UIControlStateNormal]; 

Cuida de la imagen. Debe ser .png

+1

setBackgroundImage: forState: sería un mejor enfoque si vas por ese camino. –

0

Los botones UIB personalizados responden a las interacciones del usuario a menos que su alfa esté configurada en 0. Coloque un UIButton personalizado encima de su imageView y conéctese a la acción buttonPressed. También he establecido una imagen resaltada adicional para mi UIView, ahora realmente se comporta como un UIButton. En primer lugar he definido una duración para la UIView para mantenerse destacado:

#define HIGHLIGHTED_DURATION 0.1 

A continuación, establezca la vista de la imagen resaltada si se presiona y se inicia un temporizador para evitar que destacó que la duración de la tecla. No olvides configurar la imagen resaltada para tu vista de imagen.

- (IBAction)buttonPressed:(id)sender { 

[_yourImageView setHighlighted:YES]; 
_timer = [NSTimer scheduledTimerWithTimeInterval:HIGHLIGHTED_DURATION 
              target:self 
             selector:@selector(removeHighlighted) 
             userInfo:nil 
             repeats:NO]; 
} 

Y basta con aflojar destacando cuando finalice el temporizador:

-(void) removeHighlighted{ 
    _yourImageView.highlighted = NO; 

} 
0

lazyImageView = [[UIImageView alloc] init];

     button=[[UIButton alloc]init]; 
         [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
         [button addTarget:self 
            action:@selector(aMethodForVideo:) 
         forControlEvents:UIControlEventTouchUpInside]; 
         [button setBackgroundImage:[UIImage imageNamed:@"BackTransparent.png"] forState:UIControlStateHighlighted]; 
         [button setTitle:@"" forState:UIControlStateNormal]; 

           lazyImageView.frame=CGRectMake(x, y, w, h); 
           button.frame=CGRectMake(x, y, w, h); 

marco Conjunto de botón de imagen y ambos tienen mismo marco .I utilizar este código y trabajar fine.Also establecer botón imagen de fondo forState: UIControlStateHighlighted lo que cuando se haga clic en que cuando se ve el efecto de clic.

0

Logré hacerlo usando el siguiente código. Si el iPad es horizontal, el botón se ubicará en la parte superior derecha de la pantalla.

UIButton *adminButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    adminButton.frame = CGRectMake(974.0f, 0.0f, 50.0f, 50.0f); 
    [adminButton setBackgroundColor:[UIColor clearColor]]; 
    [adminButton setTag:1]; 
    [adminButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

    [self.view addSubview:adminButton]; 

Al pulsar el 'adminButton' se ejecutará la siguiente función:

- (void)buttonPressed:(id)sender { 

int buttonId = ((UIButton *)sender).tag; 

    switch(buttonId) { 
    case 1: 
     NSLog (@"Admin button was pressed"); 
     break; 
    case 2: 
     //if there was a button with Tag 2 this will be called 
     break; 

    default: 
     NSLog(@"Key pressed: %i", buttonId); 
     break; 
    } 

} 
0

Puede ocultar un botón (o cualquier objeto) y mantenerla activa mediante la adición de una máscara a su capa. El botón será invisible pero seguirá atrapando eventos.

let layer = CAShapeLayer() 
layer.frame = .zero 
myButton.layer.mask = layer 
Cuestiones relacionadas