UIView Modifiche animate con vincoli di layout automatico
-
21-12-2019 - |
Domanda
Dì che ho un progetto che assomiglia come segue:
Ci sono due generatori di generazioneGodes - uno chiamato UIView
e l'altro chiamato yellowBox
. I vincoli di layout Auto dettano che il redBox
è di 60 punti dalla parte superiore della supervisione con 350 punti con spazi principali e finali (cioè a sinistra ea destra della vista). Il yellowBox
ha gli stessi vincoli di spazi importanti e finali. Esiste un vincolo di spazio verticale tra le due scatole di 0 per indicare che il fondo del redBox
deve essere sempre direttamente sopra il yellowBox
.
Quando l'utente tocca il pulsante di box giallo espandere, vorrei che l'altezza del redBox
aumenterà e, di conseguenza, il yellowBox
si sposta per continuare a soddisfare il vincolo dello spazio verticale (che il redBox
è sempre in cima al yellowBox
). Ecco il codice animazione:
- (IBAction)expandYellowBox:(id)sender {
[UIView animateWithDuration:0.5
animations:^{
CGRect newFrame = self.yellowBox.frame;
newFrame.size.height += 50;
self.yellowBox.frame = newFrame;
}];
}
.
Tuttavia, non sono stato in grado di far funzionare correttamente questo. Come puoi vedere dall'icona rossa, c'è un problema con i vincoli al momento:
Che è abbastanza bello, poiché non c'è modo per il layout automatico di conoscere l'altezza delle scatole. Tuttavia, non so come risolvere questo problema in modo tale da consentire che le scatole vengano ridimensionate e spostate. Ad esempio, se specifico un vincolo di altezza sul redBox
, quindi lo impedirà ad essere ridimensionato. Se impostare il vincolo di altezza per essere maggiore o uguale (per consentire l'aumento dell'altezza yellowBox
) quindi ottengo un errore di costrizione diverso:
Tutti i vincoli sono stati stabiliti utilizzando Xcode nello storyboard - nessuno è stato scritto nel codice.
Qualsiasi aiuto molto apprezzato.
.
Modifica: Come si scopre, il yellowBox
è in crescita quando si fa clic sul pulsante - è solo che non potevo dirlo perché appare dietro il yellowBox
. Ho notato solo dopo averlo fatto clic su quattro volte e ha iniziato a comparire il fondo del redBox
. Tuttavia, rimane ancora la stessa domanda - come ottenere il redBox
per attenersi sempre al fondo del redBox
.
Soluzione
Provalo come menzionato da shwet-solanki , ma aggiungi la seguente rigaDopo aver cambiato il vincolo:
[self.view layoutIfNeeded];
.
L'Ibaction sarebbe simile a
- (IBAction)expandYellowBox:(id)sender {
[UIView animateWithDuration:0.5
animations:^{
self.yellowBoxHeightConstraint.constant += 50;
[self.view layoutIfNeeded];
}];
}
.
Dove yellowBoxHeightConstraint
è il IBOutlet
per il vincolo di altezza di yellowBox
.
Spero questo sia di aiuto.
Altri suggerimenti
- .
- Aggiungi vincolo di altezza a entrambe le viste
- Crea un IBoutlet per il vincolo di altezza di YELLOWBOX
- Ora invece di cambiare l'altezza di YellowBox nel pulsante Pressed Event, piuttosto modificare il valore del vincolo dell'altezza.I.e Supponiamo che il tuo nome IBoutlet IBoutlet sia YellowBoxHeightConaint, allora
yellowBoxHeightConstraint.constant += 50;
Spero che funzioni per te.
//
// WPViewController.h
// AutoLayoutTEst
//
// Created by VASANTH K on 09/01/14.
//
//
#import <UIKit/UIKit.h>
@interface WPViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIButton *button1;
- (IBAction)buttClicked:(id)sender;
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstrain;
@property (strong, nonatomic) IBOutlet UIButton *button2;
@end
.
click event
- (IBAction)buttClicked:(id)sender {
self.heightConstrain.constant=100;
}
.
Qui è necessario impostare il heightConstrain
per il pulsante Giallo per il pulsante GIALLO, quindi creare una presa di riferimento per quel pulsante, quindi aggiornare il heightConstrain
per aggiornare la dimensione di quel pulsante che sposterà automaticamente il pulsante rosso.
https://github.com/vasanth3008/autolayoutheighdemo
Riferisci il mio progetto DEMO del campione