Я сохраняю скриншот в «Инструменты автоматизации», но некоторые элементы управления отсутствуют на этом снимке экрана. Похоже, что программно добавленные элементы управления «игнорируются».Инструменты Автоматический скриншот игнорирует программно добавленные элементы управления
Как это исправить?
Руководство скриншот в симуляторе: (обратите внимание на желтый прямоугольник)
Скриншот в инструменты автоматизации:
Сценарий автоматизации:
var target = UIATarget.localTarget();
target.delay(0.5)
target.captureScreenWithName("screenshot1.png");
Я создал новое приложение с одним представлением в Xcode (универсальный, объективный-c). Я добавил кнопку и ярлык с некоторыми ограничениями для автоматического макета в раскадровке.
Я добавил этот код, чтобы добавить желтую кнопку программно:
- (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];
}
Я использую Xcode версии 7.1.1 (7B1005), моя ОС El Capitan 10.11.1 (15B42). Я знаю, что он работал в более ранних версиях, потому что я использую ui-screen-shooter для скриншотов моего приложения, и проблемы возникают сейчас, и он работал раньше. Это не проблема с ui-screen-shooter, потому что я могу воспроизвести его только с помощью автоматизации инструментов.
Что я могу сделать?
EDIT:
Одно из различий между элементами управления в раскадровки и созданные вручную из них может быть идентификатор объекта, который можно увидеть в источнике раскадровки. В случае, если это будет проблемой, могу ли я установить id
для созданных вручную элементов управления? (Или это теряется, когда сцена читается из раскадровки?)
EDIT 2:
Я принес все свойства элементов в поле зрения контроллера представления (через ObjC/время выполнения) и по сравнению значений свойств двух кнопок. Есть небольшие различия: (не будет включать в себя идентичные записи)
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:
Скриншот выхода target.logElementTree()
:
EDIT 4:
Я добавил
[UIButton appearance].backgroundColor = [UIColor yellowColor];
и все кнопки теперь имеют желтый фон, однако кнопка «Экстра» не находится на скриншоте.
Я не ориентирован в основном на внешний вид.Я также пробовал
UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
так что кнопка похожа на типичные синие кнопки. Тем не менее кнопка не появляется на снимке экрана автоматизации.
EDIT 5:
В случае уместно: я могу доступ к элементам управления из сценария автоматизации и сделать отводы - например (из другого приложения, а не этот тест код):
target.frontMostApp().mainWindow().buttons()[25].tap()
Отламы обрабатываются, поэтому скрипт автоматизации может обращаться к элементам управления.
EDIT 6: Я создал отчет об ошибке в системе bugreport от Apple. Если вы можете воспроизвести его, может быть хорошо сделать то же самое (по крайней мере, так я понял предполагаемое использование отчета об ошибках в Apple).
EDIT 7: (спасибо quellish за ваш ответ - обрабатывая мою первую волну мыслей здесь :) Я исправил ошибку в коде - я позвонил [self.view updateConstraints];
, но это должно быть [self.view setNeedsUpdateConstraints];
. Однако это не повлияло на результаты скриншотов автоматизации.
Мне было интересно, были ли ограничения обновлены и зарегистрированы в updateViewConstraints
и некоторые другие. Это, как он вошел в то время как приложение загружается:
viewDidLoad
viewWillAppear
updateViewConstraints
viewWillLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
Так что, когда я добавить кнопку и ограничения в viewDidLoad
и updateViewConstraints
называется, я бы предположить, что все ограничения разрешаются, когда viewDidAppear
называется.
Я сделал быстрый тест, используя это в viewDidAppear
: (пока не уверен, является ли путь - У меня есть небольшой опыт работы с доступностью.)
_extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view);
скриншот автоматизации остается белым.
Интересно, однако, что в дереве элементов часть экрана дополнительной кнопки показывает правильное местоположение. Поэтому я бы предположил, что автоматизация подняла правильную позицию.
Обновите свой вопрос с помощью результата 'logElementTree()'. – quellish
@quellish Сделал это - когда я выбираю линию с помощью кнопки «Экстра», маленький снимок этой кнопки отображается справа. Область совпадает, но кнопки там нет.На снимке симулятора кнопка имеет белый цвет текста. Однако в приложениях, которые я в конечном итоге хочу «экранировать», элементы имеют черный цвет текста, но текст не отображается на скриншоте инструментов. –
Это почти наверняка проблема времени. Вы видите другое поведение, если вы используете стиль UIAppearance для стилизации кнопки? – quellish