Quando sottoclasse UIView
, di solito inserisco tutti i miei codici di inizializzazione e layout nel suo metodo init
. Ma mi è stato detto che il codice di layout dovrebbe essere eseguito ignorando layoutSuviews
. C'è un post su SO che spiega quando viene chiamato il metodo, ma mi piacerebbe sapere come usarli in pratica.UIView: layoutSubviews vs initWithFrame
Io attualmente messo tutto il mio codice nel metodo init
, in questo modo:
MyLongView.m
- (id)initWithHorizontalPlates:(int)theNumberOfPlates
{
self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)];
if (self) {
// Initialization code
_numberOfPlates = theNumberOfPlates;
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame];
[scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)];
[self addSubview:scrollView];
for(int i = 0; i < _numberOfPlates; i++){
UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]];
UIImageView *plateImage = [[UIImageView alloc] initWithImage:img];
[scrollView addSubview:plateImage];
plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2);
}
}
return self;
}
Sono i soliti compiti: l'impostazione sulla struttura della vista, inizializzando un Ivar, impostando su una scrollview, inizializzando UIImages, posizionandoli in UIImageViews, disponendoli.
La mia domanda è: quale di questi dovrebbe essere fatto in init
e quale di questi dovrebbe essere fatto in layoutSubviews
?
Lo spingerei più in basso. Crea i tuoi oggetti subview in 'viewDidLoad' piuttosto che init. le visualizzazioni vengono caricate pigramente e non vi è alcun motivo per creare visualizzazioni secondarie se la superview non verrà creata. – Abizern
Stiamo parlando di viste qui, non di ViewController. – calimarkus