Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Instruments Automation屏幕截图忽略以编程方式添加的控件_Ios_Xcode_Automation_Instruments - Fatal编程技术网

Ios Instruments Automation屏幕截图忽略以编程方式添加的控件

Ios Instruments Automation屏幕截图忽略以编程方式添加的控件,ios,xcode,automation,instruments,Ios,Xcode,Automation,Instruments,我正在仪器自动化中保存一个屏幕截图,但该屏幕截图中缺少一些控件。以编程方式添加的控件似乎被“忽略” 我怎样才能解决这个问题 模拟器中的手动屏幕截图:(注意黄色框) 仪器自动化中的屏幕截图: 自动化脚本: var target = UIATarget.localTarget(); target.delay(0.5) target.captureScreenWithName( "screenshot1.png" ); 我在Xcode中创建了一个新的单视图应用程序(universal,objec

我正在仪器自动化中保存一个屏幕截图,但该屏幕截图中缺少一些控件。以编程方式添加的控件似乎被“忽略”

我怎样才能解决这个问题

模拟器中的手动屏幕截图:(注意黄色框)

仪器自动化中的屏幕截图:

自动化脚本:

var target = UIATarget.localTarget();
target.delay(0.5)
target.captureScreenWithName( "screenshot1.png" );
我在Xcode中创建了一个新的单视图应用程序(universal,objective-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屏幕截图的问题,因为我可以用仪器自动化单独复制它

我能怎么办

编辑:

故事板中的控件和手动创建的控件之间的一个区别可能是对象ID,可以在故事板源代码中看到。如果出现问题,我是否可以为手动创建的控件设置
id
?(或者从情节提要中读取场景后,它是否丢失?)

编辑2:

我获取了视图控制器视图中元素的所有属性(通过objc/runtime),并比较了两个按钮的属性值。差别不大:(不包括相同的条目)

所有按钮现在都有黄色背景,但是“额外”按钮不在屏幕截图中

我主要关注的不是定制外观。我也试过了

UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
所以这个按钮就像典型的蓝色按钮。自动屏幕截图中仍然没有显示该按钮

编辑5:

如果相关:我可以从自动化脚本访问控件并点击-例如(从另一个应用程序,而不是此测试代码):

轻敲被处理,因此自动化脚本可以访问控件

编辑6:我在苹果的bugreport系统中创建了一个bug报告。如果你能复制它,那么同样做可能会很好(至少我是这样理解在苹果的bug报告的预期用途的)

编辑7:(感谢quellish的回答-在这里处理我的第一波想法:)我纠正了代码中的一个错误-我调用了
[self.view updateConstraints],但它应该是
[self.view setNeedsUpdateConstraints]。但是,这对自动化屏幕截图结果没有影响

我想知道是否更新了约束,并记录了对
updateViewConstraints
和其他一些约束的调用。以下是应用程序加载时的日志记录方式:

viewDidLoad
viewWillAppear
updateViewConstraints
viewWillLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
因此,当我在
viewDidLoad
中添加按钮和约束,并调用
updateViewConstraints
时,我会假设在调用
viewdidappease
时,所有约束都已解决

我在
viewdideappear
中使用它做了一个快速测试:(还不确定,这是否是一种方法——我对可访问性几乎没有经验。)

自动化屏幕截图保持白色


然而,有趣的是,在元素树中,额外按钮的屏幕截图部分显示了正确的位置。所以我假设,自动化选择了正确的位置。

您看到的问题是由几个因素造成的。如你在问题中所述,你的问题是:

  • UIAutomation屏幕截图将不包括您的样式化按钮,因为您包含了测试项目和自动化脚本
在不同的条件下,您会看到不同的行为:

  • 当按钮通过nib或故事板实例化时,问题不会发生,仅当按钮在代码中声明并添加到视图层次结构时(具体地说,视图控制器的
    viewDidLoad

  • 在早期版本的iOS(即iOS 8)中运行时,该按钮确实会出现在UIAutomation屏幕截图中

也就是说,如果您删除了在
viewDidLoad
中添加的约束,您将看到样式化按钮开始出现在屏幕截图中。这应该是一个提示-约束是问题的一部分

当布局引擎解决约束时,它会尝试成批完成尽可能多的工作,合并性能约束。当按钮和约束在nib或故事板中描述时,约束引擎将一次获得它们,并且在视图层次结构的生命周期中更早。因此,布局过程的步骤可以大大简化

但是,当在视图层次生命周期的后期添加约束时,需要重新计算约束。将添加的约束视为添加到队列中,布局引擎将在下次队列“满”时重新计算它们。UIAutomation钩住UIAccessibility API来完成它的工作,而accessibility可能不知道或不关心可视化表示的布局发生了什么。视觉表现可能会改变,但不会影响可访问性,从而影响UIAutomation的世界观

iOS 9改变了布局过程在引擎盖下的工作方式,这就是为什么您现在看到这个问题

您可以采取多种行动:

  • 在nib或故事板中构建视图层次结构。这将为您带来最一致的体验,并具有性能和其他优势

  • 使用辅助功能API提示按钮的位置(辅助功能框架)在布局传递后已更改。不幸的是,除非在布局完成之前禁用了可访问性、可见性或用户交互,否则您仍然可能看到UIAutomation在布局发生时捕获它

  • UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
    
    target.frontMostApp().mainWindow().buttons()[25].tap()
    
    viewDidLoad
    viewWillAppear
    updateViewConstraints
    viewWillLayoutSubviews
    viewWillLayoutSubviews
    viewDidAppear
    
    _extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view);