小编Qui*_*ana的帖子

在drawRect中使用iOS反转掩码

使用下面的代码,我成功地屏蔽了我绘图的一部分,但它与我想要屏蔽的相反.这掩盖了绘图的内部,我想掩盖外部.有一种简单的方法来反转这个面具吗?

myPath下面是一个UIBezierPath.

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef maskPath = CGPathCreateMutable();
CGPathAddPath(maskPath, nil, myPath.CGPath);
[maskLayer setPath:maskPath];
CGPathRelease(maskPath);
self.layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)

core-graphics masking uiview drawrect ios

24
推荐指数
5
解决办法
1万
查看次数

XCUITesting权限弹出:出现警报,但UIInterruptionMonitor不会触发

我想写一个这样的测试:

当我的应用程序转到某个窗格时,它应该请求使用相机的权限.

我想测试窗格是否出现.我正在使用XC的内置UITest框架来执行此操作.根据我在谷歌和这里发现的,似乎我应该做以下事情:

let dialogAppearedExpectation = expectationWithDescription("Camera Permission Dialog Appears")

addUIInterruptionMonitorWithDescription("Camera Permission Alert") { (alert) -> Bool in
    dialogAppearedExpectation.fulfill()
    return true
}

goToCameraPage()

waitForExpectationsWithTimeout(10) { (error: NSError?) -> Void in
    print("Error: \(error?.localizedDescription)")
}
Run Code Online (Sandbox Code Playgroud)

测试始于失败,很棒.我实现了goToCameraPage,它正确地导致出现"给予权限"弹出窗口.但是,我希望这会触发中断监视器.然而,没有捕获到这样的中断,并且不会发生履行.

我在某个地方读到app.tap()了对话框出现后你应该做的事情.但是,当我这样做时,它会单击"允许"按钮.对话框消失,仍然没有处理中断.

是否有某种方式将权限对话框视为"警报"或无法处理?我甚至进入并用一个看起来的东西替换了中断位app.alerts,但结果是空的,即使我正在看模拟器中的弹出窗口.

谢谢!我正在为iPhone 6s使用Xcode7.2,iOS 9.2模拟器.

ios swift xcode-ui-testing xcode7.2

8
推荐指数
2
解决办法
2890
查看次数

在Xcode中看到为什么"类型不符合协议"(swift)

我经常有相对复杂的协议与associatedType约束,在泛型中使用,由CoreData类型扩展使用等.因此我经常得到错误:Type .. does not conform to protocol ....我通常可以在一段时间后弄清楚这一点,但错误信息实际上是无益的 - 通常,如果问题是方法或某事的签名中的一个小错误,则该bug需要一段时间才能找到.使用Java接口,IDE通常会报告类似的内容method ... not implemented,因此我知道要更详细地查看哪种方法.

有没有办法让Xcode报告有关协议成员的详细信息?

xcode ios swift swift-protocols

6
推荐指数
1
解决办法
6859
查看次数

当用作方法参数时,&Trait和impl Trait有什么区别?

到目前为止,在我的项目中,我使用许多特性来允许在注入依赖项的单元测试中进行模拟/存根.然而,到目前为止我所做的一个细节似乎很可疑,我甚至惊讶它甚至编译.我担心会发生一些我看不见或不明白的危险事件.它基于这两种方法签名之间的差异:

fn confirm<T>(subject: &MyTrait<T>) ...
fn confirm<T>(subject: impl MyTrait<T>) ...
Run Code Online (Sandbox Code Playgroud)

我只是impl ...在方法参数中发现了语法,它似乎是唯一记录的方法,但是我的测试已经使用了另一种方式,我根据Go解决了同样的问题(方法的大小)来直觉编译时的参数,当参数可以是接口的任何实现者,并且引用可以来拯救).

这两者有什么区别?为什么他们都被允许?它们都代表合法用例,还是我的参考语法(&MyTrait<T>)严格来说更糟糕?

syntax reference traits rust

6
推荐指数
1
解决办法
188
查看次数

使用自定义值创建 CLPlacemark 以进行测试

我有一个移动CLPlacemark对象并使用它们的应用程序,我想对与它们交互的几个组件进行单元测试。为此,我希望能够使用生成CLPlacemark具有已知值的mock的方法从 MapKit 中删除对真正反向地理定位的调用。

CLPlacemark只有一个初始化程序(复制初始化程序)。但在文档中,它说:

地标对象通常由 CLGeocoder 对象生成,但您也可以自己显式创建它们。

但是,大多数成员都是只读的,因此我不确定如何创建具有自定义值的成员。是否可以在 Swift 中以这种方式设置内部属性?如果没有,关于它们在上述引文中的含义有什么想法吗?

core-location ios swift clplacemark

5
推荐指数
1
解决办法
742
查看次数

使用"where"子句在Swift算术中生成可选类型

我想在用户交互期间触发基于某些UI关系的条件逻辑(在这种情况下,我想在用户滚动到a中的某个点时调用方法UIScrollView).我希望以下代码行能够合法地执行此操作,因为它具有很强的表现力:

func scrollViewDidScroll(scrollView: UIScrollView) {
    guard let overlap = scrollView.contentOffset.y - 220 where overlap > 0 else {
        return
    }

    reactToScrollOverlap(of: overlap)
}
Run Code Online (Sandbox Code Playgroud)

但是,我得到的错误是guard let需要一个可选类型.这是合理的,但我希望在这种情况下该where子句自然会引入一个可选项,因为如果算法运算错误则没有匹配值overlap.

有没有办法使用guard let(或者说if let),包含的where条款规定了Int,CGFloat或其他原始/原始类型之间算术结果的条件?

where uiscrollview ios swift

5
推荐指数
1
解决办法
102
查看次数

在没有S3或类似外部资源的Concourse作业之间传递工件

我正在使用大厅和构建二进制文件,我想发送到集成测试.然而,它们是轻量级的,使用S3存储桶进行永久存储似乎有点过分.另外我正在进行版本控制semver-resource,这似乎也需要S3或其他方式支持它.

有没有办法配置本地工作者或类似的blobstore?我可以使用Concourse postgres数据库存储我的semver吗?它足够小,应该适合数据库表.

concourse

5
推荐指数
1
解决办法
1135
查看次数

如何在Linux上快速睡眠线程

我正在尝试编写一个小程序,该程序循环运行并每 30 秒执行一些代码。

我不太关心它的时间是否准确,但我确实关心该程序可以在 Linux 平台上编译和运行,并且可以使用 swift 包管理器来构建和测试它。

我的第一枪就像

while true {
    print("doing the work")
    sleep(30) // also tried usleep(30*1000*1000)
}
Run Code Online (Sandbox Code Playgroud)

显然,我在 swift 4 中没有sleep(_:)找到任何引用,并且该代码无法编译。我尝试使用 a Timer,但是一旦计时器开始计时,程序就会退出,因为计时器在后台运行,而主线程的唯一工作就是安排它。

这一定比看起来更容易。关于 Swift 中的线程管理,我缺少什么可以解释我发现这个有多难?

--- 编辑为了澄清为什么这与众多建议的重复项不同:

明确地尝试让主线程休眠,正如我上面提到的,我无法使用sleep其他地方接受的答案建议的函数在 Linux 上使用 Swift 进行编译。我的程序在 CLI 上下文中的上下文意味着后台线程中的延迟操作(正如许多其他可用来源所建议的那样)在这里不起作用。此外,此 CLI 在 Linux 上运行,因此我不能依赖仅限 iOS 的库。

linux swift swift-package-manager

1
推荐指数
1
解决办法
3327
查看次数