2010-03-27 12 views
12

Estoy tratando de cambiar el tamaño de un UIButton en mi aplicación de iPhone. Tengo un UIButton sintetizado y cuando llamo al siguiente código, se mueve en la pantalla, pero el ancho & de la altura del botón nunca cambia.Cómo cambiar el tamaño de UIButton

button.frame.size = CGRectMake(104, 68, 158, 70); 

Por ejemplo, cuando cambio la altura (70) a 40, la altura del botón no cambia. Sin embargo, si cambio x o y, se moverá en la pantalla.

¿Alguna idea?

Respuesta

20

El código anterior no debe compilarse; estás tratando de asignar un CGRect a un CGSize. El problema viene en la naturaleza engañosa de las propiedades. Lo que está haciendo arriba es similar a esto:

[button frame].size = CGSizeMake(150, 70); 

Obviamente, esto no cambiará el tamaño. Lo que debe hacer es tomar el marco (o límites), modificarlo y luego configurarlo. Prueba esto:

CGRect  buttonFrame = button.frame; 
buttonFrame.size = CGSizeMake(150, 70); 
button.frame = buttonFrame; 
+1

acabo de poner el ejemplo de código anterior en mi aplicación (reemplazado mi código) y que, esencialmente, hace lo mismo que el mío. Mueve el botón hacia arriba (verticalmente) en la pantalla, pero no cambia su tamaño. Debo añadir que cuando arrastré este botón a mi vista en IB, configuré el botón "Personalizar". También tengo una imagen de fondo en el botón y tengo el modo de vista configurado en "Abajo". He hecho cosas como esta antes en otros idiomas, y sé que esto es algo simple, pero el comportamiento de moverse en la pantalla frente al cambio de tamaño es muy extraño. – Adam

+0

Su botón probablemente está cambiando de tamaño, pero su mapa de bits no lo está. Es posible que desee utilizar una imagen extensible para el fondo del botón, en lugar de una imagen fija. –

0

En caso de no ser esto:

button.frame = CGRectMake(104, 68, 158, 70); 

es decir, que está creando el rect correctamente, pero que estés asignándole al elemento tamaño de la llama CGRect marco, no todo el CGRect. De CGGeometry.h:

struct CGPoint { 
    CGFloat x; 
    CGFloat y; 
}; 
struct CGSize { 
    CGFloat width; 
    CGFloat height; 
}; 
struct CGRect { 
    CGPoint origin; 
    CGSize size; 
}; 

O más explícitamente, se podría escribir:

button.frame.size.width=158; 
button.frame.size.height=70; 
button.frame.origin.x=104; 
button.frame.origin.y=68; 
2
CGRect rect=CGRectMake(104, 68, 158, 70); 

[self.button setBounds:rect]; 

(botón tiene que ser declarado como propiedad en el .h, y sintetizado en el .m)

3

Parte del problema es que está modificando el valor devuelto de un método de acceso, en lugar de usar el método de establecimiento.

button.frame es engañoso, es la notación de punto que significa [button frame] que devuelve struct CGRect, que luego se modifica, y los cambios se descartan en silencio.

Con el fin de modificar el marco real que tendrá lugar de utilizar el método de selección [botón setFrame:] para los que la notación de puntos es todavía button.frame pero esta vez como un valor-I, por lo que no button.frame =button.frame.something =.

Si aún obtiene el comportamiento de movimiento, parte de la causa podría ser que sus nuevos valores X e Y no se corresponden con los anteriores, y quizás por algún error los valores de su nuevo tamaño sean los mismos como los viejos. Pruebe con un ancho de 300 y una altura de 300 solo para patadas.

9

Para cambiar el tamaño del botón que hace:

[button setFrame:CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)]; 

ejemplo

[button setFrame:CGRectMake(173, 269, 130, 44)]; 

Asegúrese de que la casilla de verificación "Usar el diseño automático" no está establecido en el archivo Xib o Storyboard. Si la opción está configurada, el comando no funciona.

+0

He votado su respuesta solo por su sugerencia: ** Asegúrese de que la casilla de verificación "Usar distribución automática" no esté configurada en el archivo Xib o Storyboard. Si la opción está configurada, el comando no funciona. ** –

2

Funciona sin problemas, ya que las clases de tamaño y de disparo automático están desactivadas. En mi prueba el guión gráfico tiene sólo un botón con su acción de enviar a este método:

- (IBAction)action:(UIButton *)button { 
    button.frame = CGRectMake(0, 0, 158, 70); 
} 

comprobar las propiedades de su guión.

enter image description here

Cuestiones relacionadas