我正在使用非常方便的UIColor(patternImage:)在一个iOS10应用程序中用Xcode 8.2创建一些带平铺模式的CAShapeLayers。平铺总是从视图的原点开始,如果您希望它从其他地方开始,这可能会很不方便。为了说明这一点,下面是模拟器的截图(代码如下):
ios - 如何在Swift中更改UIColor patternImage的相位?-LMLPHP
左边的CAShapeLayer从(0,0)开始,所以一切都很好。右边的那个在(110,50),所以它在中间分裂。代码如下:

let firstBox = CAShapeLayer()
firstBox.fillColor = UIColor(patternImage: UIImage(named: "test-image")!).cgColor
view.layer.addSublayer(firstBox)
firstBox.path = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 100, height: 100)).cgPath

let secondBox = CAShapeLayer()
secondBox.fillColor = UIColor(patternImage: UIImage(named: "test-image")!).cgColor
view.layer.addSublayer(secondBox)
secondBox.path = UIBezierPath(rect: CGRect(x: 110, y: 50, width: 100, height: 100)).cgPath

我想调整模式的相位,使两个瓷砖都显示完整的面。苹果公司的UIColor(patternImage:)的documentation功能是指一个用于此目的的函数:
若要更改相位,请将颜色设置为当前颜色,然后使用
setPatternPhase(_:)改变相位的功能。
听起来很简单!但我很难实现它。我不太清楚“使颜色成为当前颜色”是什么意思。我尝试获取当前上下文并在将填充颜色分配给层之前和之后对其调用CAShapeLayer
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 25, height: 25))

没有明显的效果。我尝试将包含setPatternPhase的子类化,并按照this answer中的建议,在其UIView方法中设置阶段。但是drawRect:在SWIFT中不存在,所以我尝试了drawRect:draw(_ rect:)。两个函数都被调用,但没有明显的效果。
class PatternView: UIView {
    override func draw(_ rect: CGRect) {
        UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 25, height: 25))
        super.draw(rect)
    }
    override func draw(_ layer: CALayer, in ctx: CGContext) {
        ctx.setPatternPhase(CGSize(width: 25, height: 25))
        super.draw(layer, in: ctx)
    }
}

在Dave Weston的建议下,我在调用draw(_ layer:, in:)之前使用UIImage设置当前笔划并填充当前上下文。不幸的是,输出没有受到影响。这是我试过的密码:
let secondBoxColor = UIColor(patternImage: UIImage(named: "test-image")!)
secondBoxColor.set()
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 50, height: 50))

let secondBox = CAShapeLayer()
secondBox.fillColor = secondBoxColor.cgColor
view.layer.addSublayer(secondBox)
secondBox.path = UIBezierPath(rect: CGRect(x: 110, y: 50, width: 100, height: 100)).cgPath

我如何改变被画成.set()的模式的相位?

最佳答案

要使模式成为当前颜色,应该在包含模式的set()实例上调用UIColor实例方法。这将颜色配置为当前笔划,并为当前上下文填充颜色。
然后,根据苹果的文档,setPatternPhase应该可以工作。

10-08 07:45