我正在使用非常方便的UIColor(patternImage:)
在一个iOS10应用程序中用Xcode 8.2创建一些带平铺模式的CAShapeLayer
s。平铺总是从视图的原点开始,如果您希望它从其他地方开始,这可能会很不方便。为了说明这一点,下面是模拟器的截图(代码如下):
左边的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
应该可以工作。