Как получить подпредставление UIImageView (UIView), чтобы покрыть его полностью? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть UIImageView, помещенный на раскадровку, и я пытаюсь программно добавить UIView в качестве подпредставления к нему, и этот UIView точно соответствует размеру и положению родительского UIImageView, чтобы он покрывал его.

UIView - это пользовательский класс UIView, который рисует слой CAShapeLayer, который заполняет его фрейм, если это вообще имеет значение.

В дополнение к следующему коду я также безуспешно пробовал "redOverlay.center = parentImage.center".

В моем viewdidload () у меня есть:

let redOverlay = RedOverlay(frame: CGRect(x: 0.0, y: 0.0, width: parentImage.bounds.width, height: parentImage.bounds.height))

parentImage.addSubview(redOverlay)

А вот мой подкласс RedOverlay UIView, если это имеет значение:

import UIKit

extension CGFloat {
    func toRadians() -> CGFloat {
        return self * CGFloat.pi / 180.0
    }
}

class RedOverlay: UIView {

    var path: UIBezierPath!

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.backgroundColor = UIColor.darkGray.withAlphaComponent(0.5)

        pie()

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    func pie() {
        path = UIBezierPath()
        path.move(to: CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/2))
        path.addArc(withCenter: CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/2),
                    radius: self.bounds.size.width/2,
                    startAngle: CGFloat(215).toRadians(),
                    endAngle: CGFloat(90).toRadians(),
                    clockwise: true)
        path.close()

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = path.cgPath
        shapeLayer.fillColor = UIColor.red.cgColor
        shapeLayer.opacity = 0.5
        self.layer.addSublayer(shapeLayer)

    }

}

Результат, который я получаю, действительно отлично работает на iPhone 6 , но все, что больше, например, 6s или ipads, и дочерний UIView на самом деле заметно меньше, чем UIImageView. В iPad UIView находится слева, в то время как в 6-ых его осталось немного.

По сути, создается впечатление, что создаваемый UIView не так широк, как изображение, хотя для определения ширины UIView использовался parentImage.bounds.width. У меня действительно есть «Clip to Bounds» и Aspect Fit в IB, так что я не знаю, почему изображение будет больше, чем его границы, если это вообще возможно.

Какой самый чистый способ заставить это подпредставление соответствовать родительскому представлению для всех размеров устройств?

РЕДАКТИРОВАТЬ: Решение, которое я нашел, состояло в том, чтобы вызвать мою функцию pie () (которая рисует CAShapeLayer), переопределив layoutSubviews и вызвав туда pie (), чтобы мой shapeLayer обновлялся при каждом изменении представления. Я удалил .addSublayer (shapeLayer) из pie () и теперь вызываю его в viewdidload, если многократные вызовы layoutsubviews могут привести к созданию многих слоев.

override func layoutSubviews() {
        super.layoutSubviews()
        pie()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...