Pulsanti di risposta non allineati a destra per NSAlert
Domanda
Ho un NSAlert con una vista accessori e tre pulsanti, i pulsanti non sono allineati a destra (per il sistema LTR) ma sembra espandersi alla larghezza della vista accessori come mostrato di seguito
Rimuovendo anche la visualizzazione degli accessori, i tre pulsanti non sono allineati correttamente a destra
Come si risolve questo problema?Non voglio sostituire NSAlert scrivendo il codice da solo, perché devo reinventare la ruota?
Il codice che utilizzo è stato copiato da setAccessoryView e riportato di seguito
NSTextView *accessory = [[NSTextView alloc] initWithFrame:NSMakeRect(0,0,600,15)];
NSFont *font = [NSFont systemFontOfSize:[NSFont systemFontSize]];
NSDictionary *textAttributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
[accessory insertText:[[NSAttributedString alloc] initWithString:@"Text in accessory view"
attributes:textAttributes]];
[accessory setEditable:NO];
[accessory setDrawsBackground:NO];
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:@"Message text"];
[alert setInformativeText:@"Informative text"];
[alert setAccessoryView:accessory];
[alert addButtonWithTitle:@"Btn 3"];
[alert addButtonWithTitle:@"Btn 2"];
[alert addButtonWithTitle:@"Btn 1"];
[alert runModal];
[alert release];
Soluzione
Questo è il layout predefinito corrente di un avviso. Un avviso con tre pulsanti viene trattato in modo diverso perché il suo caso d'uso comune è:
- Il primo pulsante (ad es. OK) rappresenta una conferma
- Il secondo pulsante (ad es. Annulla) rappresenta un annullamento
- Il terzo pulsante (ad es. Uccidi il pinguino) rappresenta un'azione alternativa, potenzialmente distruttiva.
Il terzo pulsante è posizionato a sinistra per chiarire che rappresenta un'azione distinta da vai avanti (primo pulsante) e interrompi (secondo pulsante).
Questo può essere visto in alcune applicazioni Apple. In Pages:
In TextEdit:
Inoltre, La documentazione di NSAlert afferma che:
Il layout degli avvisi standard è soggetto a modifiche nelle future versioni del software di sistema. Pertanto, se ti affidi a un layout di avviso personalizzato, dovresti assicurarti che i layout funzionino come previsto nelle versioni future di Mac OS.
Quindi potrebbero decidere in futuro di allineare tutti e tre i pulsanti a destra, o solo il primo pulsante a destra e i due pulsanti rimanenti a sinistra. Questo spiega perché NSAlert non fornisce API pubbliche per specificare la posizione o l'allineamento dei suoi pulsanti.
Se hai davvero bisogno di un layout diverso, sembra che dovrai progettarlo da solo.