Ho il seguente problema: Ho creato una classe personalizzata UIView
e il suo layout nel file XIB
. Diciamo che la dimensione della mia vista personalizzata in XIB è 150 x 50. Ho abilitato sizeClasses
(wAny hAny) e AutoLayout
. In Metriche simulate ho impostato Size = Freeform
, Status Bar = None
, tutto other = Inferred
.Ridimensiona a livello di codice Uiview personalizzato da XIB
codice della mia classe personalizzata UIView
si presenta così:
#import "CustomView.h"
@implementation CustomView
#pragma mark - Object lifecycle
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self setup];
}
return self;
}
#pragma mark - Private & helper methods
- (void)setup {
if (self.subviews.count == 0) {
[[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self options:nil];
self.bounds = self.view.bounds;
[self addSubview:self.view];
}
}
@end
Nel mio UIViewController
dove voglio aggiungere questa usanza UIView
, ho fatto UIView manichino (che taglia ho impostato in Interface Builder) dove ho voglio aggiungere il mio CustomView
e Mi piacerebbe che il mio CustomView
soddisfi i limiti della mia vista container.
io sto cercando di fare che in questo modo:
_vCustomView = [[CustomView alloc] init];
_vCustomView.translatesAutoresizingMaskIntoConstraints = NO;
[_vContainer addSubview:_vCustomView];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]];
[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
ma senza fortuna. Supponiamo che la vista del contenitore sia 300 x 100, quando aggiungo la mia personalizzata UIView
ad essa, , la mia visualizzazione personalizzata è ancora 150 x 50.
ho cercato di lavorare senza vista container - aggiungere il mio oggetto personalizzato UIView
direttamente al self.view della mia UIViewController
e impostare la sua larghezza e altezza con:
autoLayout
vincoli- utilizzando
initWithFrame
quando inizializzare la mia customUIView
ma ancora una volta - senza fortuna. visualizzazione personalizzata è sempre di 150 x 50.
Qualcuno può spiegare a me come posso programmazione aggiungere il mio personalizzato UIView
fatto in XIB
e ridimensionarlo utilizzando autoLayout
vincoli?
Molte grazie in anticipo.
Modifica # 1: errore che ottengo quando si tenta di eseguire il codice di Andrea sul mio CustomView
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x17489b760 V:[UIView:0x17418d820(91)]>",
"<NSLayoutConstraint:0x170c9bf80 V:|-(0)-[CustomView:0x1741da7c0] (Names: '|':CustomView:0x1741da8b0)>",
"<NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0)>",
"<NSLayoutConstraint:0x170c9be90 V:|-(0)-[CustomView:0x1741da8b0] (Names: '|':UIView:0x17418d820)>",
"<NSLayoutConstraint:0x170c9bee0 CustomView:0x1741da8b0.bottom == UIView:0x17418d820.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x170c9dba0 h=--& v=--& CustomView:0x1741da7c0.midY == + 25.0>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x170c9bfd0 V:[CustomView:0x1741da7c0]-(0)-| (Names: '|':CustomView:0x1741da8b0)>
Edit # 2: Funziona!
Dopo @Andrea aggiunto:
view.translatesAutoresizingMaskIntoConstraints = NO;
nel suo:
- (void) stretchToSuperView:(UIView*) view;
metodo, tutto funziona come mi aspettavo.
Grazie a @Andrea.
Stai chiamando 'layoutIfNeeded' dopo aver apportato le modifiche ai vincoli? Potresti postare il codice dove cambi la larghezza e l'altezza? Inoltre, se la vista ha un'altezza e una larghezza vincoli nello storyboard, l'aggiunta dei vincoli al 'contentView' farà in modo che i vincoli si bloccino, perché saranno in conflitto. –
@CatalinaT. La ringrazio per la risposta. Non ho chiamato layoutIfNeeded, ma ora ci ho provato, non ha apportato alcuna modifica. _vContainer è una vista fittizia che si trova al centro del mio schermo. La mia idea è di aggiungere il mio CustomView a quella vista fittizia e che il mio CustomView ha le stesse dimensioni come vista fittizia. Ecco perché ho scritto 4 vincoli sopra dove sto dicendo che il mio CustomView dovrebbe essere allineato con tutti e quattro i lati della vista fittizia. Indirettamente, sto impostando la larghezza e l'altezza di CustomView in questo modo. Ma, nessuna fortuna. CustomView ha sempre le stesse dimensioni del suo XIB (150 x 50). – uerceg