Я использую очень удобный UIColor(patternImage:)
, чтобы создать CAShapeLayer
с черепичными узорами в приложении iOS 10 с Xcode 8.2. Плинтус всегда начинается в начале представления, что может быть неудобно, если вы хотите, чтобы он начинался где-то в другом месте. Чтобы проиллюстрировать это, вот скриншот от имитатора (код ниже):Как я могу изменить фазу UIColor patternImage в Swift?
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
Я хочу, чтобы настроить фазу шаблона для правильного CAShapeLayer
, так что обе плитки показывают анфас. Apple, documentation для UIColor (patternImage :) услужливо относимся к функции для этой цели:
Чтобы изменить фазу, сделать цвет текущего цвета, а затем использовать функцию setPatternPhase(_:) изменить фазу.
Звучит просто! Но мне трудно это реализовать. Я не совсем уверен, что означает «сделать цвет текущего цвета». Я пытался получать текущий контекст и вызов setPatternPhase
на него, как до, так и после назначения цвет заливки слоя:
UIGraphicsGetCurrentContext()?.setPatternPhase(CGSize(width: 25, height: 25))
Нет заметного эффекта. Я попробовал подклассификацию содержащего UIView
и установил фазу в ее методе drawRect:
, как предложено в this answer. Но drawRect:
не существует в Swift, поэтому я попробовал как draw(_ rect:)
, так и draw(_ layer:, in:)
. Обе функции вызываются, но нет заметного эффекта.
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)
}
}
По предложению Дейва Уэстона, я использовал UIImage
«s .set()
для установки текущего обводки и заливки для текущего контекста перед вызовом setPatternPhase
. К сожалению, выход не изменяется. Вот код, который я попробовал:
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
Как я могу сдвинуть фазу шаблона, который получает втянут в CAShapeLayer
?
Спасибо за вашу помощь. Я пытался использовать 'set()' перед 'setPatternPhase()', но это не влияет на результат. Я редактировал свой вопрос, чтобы включить новый код (в конце). Что я делаю не так? – Robert