У меня есть 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()
}