Ho una vista con un paio di pulsanti, varie dimensioni. Tutti loro hanno un titolo e un'immagine. Volevo avere l'immagine in alto, il titolo in fondo, centrato. Ciò funziona correttamente con il seguente codice:Impostazione UIButton titleEdgeInsets e imageEdgeInsets è lento con Autolayout
- (void)centerAlignImageAndTextForButton:(UIButton*)button
{
CGFloat spacing = 5;
CGSize imageSize = button.imageView.frame.size;
button.titleEdgeInsets = UIEdgeInsetsMake(0, -imageSize.width, -(imageSize.height + spacing), 0);
CGSize titleSize = button.titleLabel.frame.size;
button.imageEdgeInsets = UIEdgeInsetsMake(-(titleSize.height + spacing), 0, 0, -titleSize.width);
}
Tuttavia, noto una piccola pausa prima di entrare in questa visualizzazione. Tempo Profiler in Strumenti dimostra, che il 99% del tempo trascorso in viewDidLoad è causata chiamando il mio metodo per i pulsanti:
cose283.0ms -[XViewController viewDidLoad]
282.0ms -[XViewController centerAlignImageAndTextForButton:]
141.0ms -[UIButton imageView]
98.0ms -[UIView(Hierarchy) layoutBelowIfNeeded]
141.0ms -[UIButton titleLabel]
103.0ms -[UIView(Hierarchy) layoutBelowIfNeeded]
Vari di layout relativi sono chiamati all'interno [UIView(Hierarchy) layoutBelowIfNeeded]
, come [UIView(AdditionalLayoutSupport) recursiveLayoutEngineDidChange]
o [NSLayoutConstraint addToEngine]
.
So che sarebbe possibile impostare questi inserimenti in Interface Builder, ma non solo quello è un lavoro noioso (è necessario "indovinare" la larghezza del testo); l'app sarà anche localizzata, quindi gli insetti che sono validi per una lingua, non saranno per un'altra dove la dimensione del testo è diversa (sto usando la localizzazione di base per storyboard e file .strings invece di duplicare l'intero storyboard per ogni lingua). Quindi per me sembra che impostare gli insets a livello di codice sia la strada da percorrere, ma il ritardo che provoca non è realmente accettabile.
Qualche idea su come risolvere questo problema?
Perché non li si imposta su 'layoutSubViews'? – orkoden