El button UIB no se mueve si se llama después de addSubView

Por lo tanto, estoy intentando mover un UIButton después de hacer clic.

El método _addMoreFields se _addMoreFields después de hacer clic en el button.

_addMoreFieldBtn es un UIButton global. Cuando hago clic no sucede nada.

La parte extraña es que si comento el código addSubView , entonces el button se mueve.

Si conservo ese código, el button no se mueve.

¿Algunas ideas?

 -(void)movePlusButton { NSLog(@"Moving button"); [UIButton beginAnimations:nil context:nil]; [UIButton setAnimationDuration:0.3]; _addMoreFieldsBtn.center = CGPointMake(30,30); [UIButton commitAnimations]; } - (IBAction)addMoreFields:(id)sender { CGRect currentBtnFrame = [(UIButton *)sender frame]; CGPoint org = currentBtnFrame.origin; UILabel *whoWasIn = [[UILabel alloc] initWithFrame:CGRectMake(110, org.y, 85, 21)]; whoWasIn.text = @"test"; UITextField *whoWasInField = [[UITextField alloc] initWithFrame:CGRectMake(59, whoWasIn.frame.origin.y+40, 202, 30)]; whoWasInField.placeholder = @"test2"; UILabel *with = [[UILabel alloc] initWithFrame:CGRectMake(136, whoWasInField.frame.origin.y+40, 49, 21)]; with.text = @"with"; whoWasInField.borderStyle = UITextBorderStyleRoundedRect; UITextField *withField = [[UITextField alloc] initWithFrame:CGRectMake(59, with.frame.origin.y+40, 202, 30)]; withField.placeholder = @"test3"; withField.borderStyle = UITextBorderStyleRoundedRect; [_homeView addSubview:whoWasIn]; [_homeView addSubview:with]; [_homeView addSubview:whoWasInField]; [_homeView addSubview:withField]; [self movePlusButton]; } 

NOTA: También traté de cambiar el marco pero tengo el mismo problema. Comienza a animar desde la nueva location que puse al lugar existente.

El problema es que los nuevos proyectos en iOS 6 / Xcode 4.5 tienen "Autolayout" habilitado de forma pnetworkingeterminada. Autolayout es un reemploop para "Springs and Struts" (pero solo funciona con iOS 6). Esta function agrega restricciones a una vista que tiene prioridad sobre el movimiento que estaba intentando en su código.

Entonces, hay tres arreglos posibles para esto:

1) Crear nuevas restricciones en el button mediante progtwigción. Autolayout es bastante potente y flexible … especialmente si está tratando de soportar la huella tanto del iPhone 5 como de models anteriores. Puede encontrar más información sobre cómo hacerlo revisando el video de WWDC: Introducción al layout automático para iOS y OS X

2) No utilice Autolayout. Seleccione una vista en su Storyboard, y en el Inspector de files, desactive la casilla "Usar reproducción automática".

3) Crea IBOutlets para cada una de las restricciones en el button. Luego, antes de mover el button, elimine esas restricciones:

 @interface MyViewController : UIViewController @property (weak, nonatomic) IBOutlet UIButton *addMoreFieldsBtn; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *hConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *vConstraint; - (IBAction)addMoreFields:(id)sender; @end 

y…

 -(void)movePlusButton { NSLog(@"Moving button"); [self.view removeConstraint:self.hConstraint]; [self.view removeConstraint:self.vConstraint]; [UIButton beginAnimations:nil context:nil]; [UIButton setAnimationDuration:0.3]; _addMoreFieldsBtn.center = CGPointMake(30,30); [UIButton commitAnimations]; } 

(la vista real a la que debe llamar removeConstraints: on es la vista principal del button, que puede o no ser auto.view).

En realidad, creo que lo que está sucediendo es que su subvista llegue a la pantalla primero y, por lo tanto, tenga prioridad, y luego, una vez que se elimine la subvista, el button se moverá si cambia el código:

 [_homeView addSubview:whoWasIn]; [_homeView addSubview:with]; [_homeView addSubview:whoWasInField]; [_homeView addSubview:withField]; [self movePlusButton]; 

} // mover el [self movePlusButton]; Subir 6 líneas de código o convertirlo en primera línea.

 [self movePlusButton]; [_homeView addSubview:whoWasIn]; [_homeView addSubview:with]; [_homeView addSubview:whoWasInField]; [_homeView addSubview:withField]; 

Esto debería resolver todos tus problemas.

🙂