Sto risparmiando uno screenshot di strumenti per l'automazione, ma alcuni controlli mancano in questo screenshot. Sembra che i controlli aggiunti a livello di codice siano "ignorati".strumenti per l'automazione screenshot ignora programmazione aggiunto controlli
Come posso risolvere il problema?
Manuale screenshot in Simulator: (notare la scatola gialla)
Schermata di strumenti per l'automazione:
Lo script di automazione:
var target = UIATarget.localTarget();
target.delay(0.5)
target.captureScreenWithName("screenshot1.png");
Ho creato una nuova applicazione di visualizzazione singola in Xcode (universale, obiettivo-c). Ho aggiunto un pulsante e un'etichetta con alcuni vincoli per il layout automatico nello storyboard.
ho aggiunto questo codice per aggiungere il pulsante giallo di programmazione:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIButton *b = [[UIButton alloc] init];
b.backgroundColor = [UIColor yellowColor];
[b setTitle:@"Extra" forState:UIControlStateNormal];
[b setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:b];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailingMargin multiplier:1.0 constant:0.0]];
[self.view setNeedsUpdateConstraints];
// Correction: - initially I used the line below, but that was wrong
// The problem is not solved with using setNeedsUpdateConstraints.
// [self.view updateConstraints];
}
sto usando Xcode versione 7.1.1 (7B1005), il mio sistema operativo è El Capitan 10.11.1 (15B42). So che ha funzionato nelle versioni precedenti, perché io uso ui-screen-shooter per gli screenshot della mia app e ora i problemi si verificano e ha funzionato prima. Non è un problema con l'ui-screen-shooter, perché posso riprodurlo solo con l'automazione degli strumenti.
Cosa posso fare?
EDIT:
Una differenza tra i controlli in storyboard e quelli creati manualmente potrebbe essere l'ID oggetto, che si può vedere nella sorgente storyboard. Nel caso in cui questo fosse il problema, posso impostare il id
per i controlli creati manualmente? (O è perso, una volta che la scena viene letto dallo storyboard?)
EDIT 2:
Presi tutte le proprietà degli elementi in vista del controller della vista (tramite objc/runtime) e confrontato i valori delle proprietà dei due pulsanti. Ci sono piccole differenze: (non includerà elementi identici)
Button from Storyboard | Manual Button ----------------------------------------------------------------- "_defaultRenderingMode" = 2; | "_defaultRenderingMode" = 1; text = Button; | text = Extra; | (several position values slightly different) | description contains: | "autoresize = RM+BM;" | | backgroundColorSystemColorName = yellowColor;
EDIT 3:
Una schermata dell'uscita di target.logElementTree()
:
EDIT 4:
ho aggiunto
[UIButton appearance].backgroundColor = [UIColor yellowColor];
e tutti i pulsanti ora hanno lo sfondo giallo, tuttavia, il pulsante "Extra" non è nello screenshot.
Io non sono concentrato principalmente sulla aspetto personalizzato.Ho anche provato
UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
quindi il pulsante è proprio come i tipici pulsanti blu. Ancora il pulsante non appare nello screenshot dell'automazione.
EDIT 5:
Nel caso in cui sia rilevante: Posso accedere ai controlli dallo script di automazione e fare rubinetti - per esempio (da un'altra applicazione, non questo codice di prova):
target.frontMostApp().mainWindow().buttons()[25].tap()
I tocchi vengono elaborati, quindi lo script di automazione può accedere ai controlli.
EDIT 6: Ho creato un bug report nel sistema di segnalazione di bug di Apple. Se riesci a riprodurlo, potrebbe essere bello fare lo stesso (almeno questo è il modo in cui ho compreso l'uso previsto del bug reporting su Apple).
EDIT 7: (grazie a quellish per la risposta - elaborazione della mia prima ondata di pensieri qui :) Ho corretto un errore nel codice - Ho chiamato [self.view updateConstraints];
, ma dovrebbe essere [self.view setNeedsUpdateConstraints];
. Tuttavia, ciò non ha avuto alcuna influenza sui risultati dello screenshot dell'automazione.
Mi chiedevo se i vincoli sono stati aggiornati e le chiamate registrate a updateViewConstraints
e alcune altre. Ecco come viene registrato mentre l'applicazione sta caricando:
viewDidLoad
viewWillAppear
updateViewConstraints
viewWillLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
Così, quando ho aggiungere il pulsante ed i vincoli in viewDidLoad
, e updateViewConstraints
si chiama, presumo che tutti i vincoli sono risolte quando viewDidAppear
si chiama.
ho fatto un test rapido utilizzando questo viewDidAppear
: (Non ancora sicuro, se questo è il modo di andare - Ho poca esperienza con l'accessibilità.)
_extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view);
L'automazione schermata rimane bianca.
È interessante tuttavia che nell'albero degli elementi la porzione di schermata del pulsante aggiuntivo mostra la posizione corretta. Quindi suppongo che l'automazione abbia preso la posizione corretta.
Si prega di aggiornare la domanda con l'output da 'logElementTree()'. – quellish
@quellish Lo ha fatto - quando seleziono la linea con il pulsante "Extra", la piccola schermata di quel pulsante è mostrata sulla destra. La regione corrisponde, ma il pulsante non è lì.Nello screenshot del simulatore il pulsante ha il colore del testo bianco. Tuttavia, nelle app che alla fine voglio "screenshoot" gli elementi hanno il colore del testo nero ma il testo non è visibile nello screenshot degli strumenti. –
È quasi certamente un problema di temporizzazione. Riesci a vedere un comportamento diverso se utilizzi UIAsembra per modellare il pulsante? – quellish