Подкласс UIImageView layoutSubviews () против init () - PullRequest
0 голосов
/ 17 января 2020

Я обнаружил проблему, из-за которой повторные вызовы layoutSubviews (), в которых я создавал свои подпредставления (UIImageView) и прикреплял необходимые анимации, заставляли анимации постоянно повторяться без возможности их остановки. Таким образом, возникла необходимость найти другой способ добиться создания подпредставлений и прикрепления анимаций.

Очевидная вещь, которую нужно сделать, это переместить код layoutSubviews ()

    override func layoutSubviews() {
        super.layoutSubviews()
        print("layoutSubviews()")
        spindleLeft = addSpindle(index: 1, posX: 505, posY: 350)
        spindleRight = addSpindle(index: 2, posX: 1610, posY: 350)

        spinSpindle(spindle: spindleLeft)
        spinSpindle(spindle: spindleRight)
    }

до инициализации

    init(cassetteType: CassetteType) {
        self.cassetteType = cassetteType
        super.init(image: UIImage(named: self.cassetteType.rawValue + "Cassette"))
        self.translatesAutoresizingMaskIntoConstraints = false
        self.isUserInteractionEnabled = true
        self.contentMode = .scaleAspectFit

        print("init(cassetteType:)")

        spindleLeft = addSpindle(index: 1, posX: 505, posY: 350)
        spindleRight = addSpindle(index: 2, posX: 1610, posY: 350)

        spinSpindle(spindle: spindleLeft)
        spinSpindle(spindle: spindleRight)
    }

Однако, когда я делаю это, подпредставления шпинделя больше не отображаются. Похоже, они были созданы, и анимация применяется, но они больше не видны.

Почему это так? Чем отличаются layoutSubviews и init в этом отношении?

Код addSpindle () создает каждое подпредставление следующим образом:

    func addSpindle(index: Int, posX: CGFloat, posY: CGFloat) -> UIImageView {
        let cassetteBounds = self.bounds
        let cassetteWidth = cassetteBounds.width
        let cassetteHeight = cassetteBounds.height

        let cassetteImageWidth =  self.image!.size.width
        let cassetteImageHeight = self.image!.size.height

        var scale = cassetteWidth / cassetteImageWidth

        var spindleWidth = cassetteWidth
        var spindleHeight = cassetteImageHeight*scale
        var spindleX = 0 as CGFloat
        var spindleY = (cassetteHeight - spindleHeight)/2

        if spindleHeight > cassetteHeight {
            scale = cassetteHeight / cassetteImageHeight
            spindleHeight = cassetteHeight
            spindleWidth = cassetteImageWidth*scale
            spindleY = 0 as CGFloat
            spindleX = (cassetteWidth - spindleWidth)/2
        }

        let spindle = UIImageView(image: UIImage(named: self.cassetteType.rawValue + "Spindle"))
        self.addSubview(spindle)

        spindle.frame.origin.x = spindleX + (posX*scale)
        spindle.frame.origin.y = spindleY + (posY*scale)
        spindle.frame.size.width = spindle.image!.size.width*scale //299.0
        spindle.frame.size.height = spindle.image!.size.height*scale //299.0

        let gesture = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
        gesture.numberOfTouchesRequired = 1
        gesture.minimumPressDuration = 0

        spindle.isUserInteractionEnabled = true
        spindle.isExclusiveTouch = true
        spindle.tag = index
        spindle.addGestureRecognizer(gesture)

        return spindle
    }

1 Ответ

1 голос
/ 17 января 2020

Вы используете self.bounds в вашем методе addSpindle. Поскольку представление еще не выложено в init, его границы еще не определены.

Вы можете создавать свои представления шпинделя в init, но вам нужно установить их рамки на layoutSubviews, когда будут вычислены границы родителя.

...