CALayer не рисует там, где обведено

Я пытаюсь нарисовать CALayer поверх CATileLayer. По сути, когда пользователь нажимает на слой плитки, я хочу обновить представление с помощью CALayer. Он не рисует там, где ожидалось:

Вот класс для CATileLayer, который имеет обзор на раскадровке

class SquareView: UIView {

    override class var layerClass: AnyClass {
        return CATiledLayer.self
    }

    required init?(coder aDecoder: NSCoder ) {
        super.init(coder: aDecoder)
        guard let layer = self.layer as? CATiledLayer else { return nil }
        layer.contentsScale = 40.0
        layer.tileSize = CGSize(width: 40.0, height: 40.0)
    }

    override func draw(_ rect: CGRect) {

        let context = UIGraphicsGetCurrentContext()
        let red = CGFloat(drand48())
        let green = CGFloat(drand48())
        let blue = CGFloat(drand48())

        context?.setFillColor(red: red, green: green, blue: blue, alpha: 1.0)
        context?.fill(rect)
    }

Вот следующий слой, который рисуется в 0.0, 0.0, и я не уверен, почему он не покрывает нужный квадрат.

    override func viewDidLoad() {
        super.viewDidLoad()

        let theSelector : Selector = #selector(ViewController.tapGesture)
        let tapGesture = UITapGestureRecognizer(target: self, action: theSelector)
        tapGesture.numberOfTapsRequired = 1
        view.addGestureRecognizer(tapGesture)

    }

    func tapGesture(sender: UITapGestureRecognizer) {
        let theLayer = CALayer()

        let location = sender.location(in: inputView)
        let xInView = location.x
        let yInView = location.y


        let red = CGFloat(drand48())
        let green = CGFloat(drand48())
        let blue = CGFloat(drand48())

        theLayer.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0).cgColor

        theLayer.bounds = CGRect(x: xInView, y: yInView, width: 40.0, height: 40.0)



        view.layer.addSublayer(theLayer)
     }

person mrabins    schedule 20.12.2016    source источник
comment
Вы пытались использовать атрибут фрейма вместо атрибута границ?   -  person Eliot Arntz    schedule 20.12.2016


Ответы (1)


Оказывается, границы по умолчанию равны 0,0, 0,0. Следовательно, для обработки такого случая лучше использовать свойство hittest или функцию touches begin.

person mrabins    schedule 25.12.2016