Я весь день искал помощи, но не могу найти ответ.
У меня есть подпредставление, в котором я рисую прямоугольник, прямоугольник обрамлен подпредставлением, поэтому мне нужно знать размер подпредставления, отрегулированный autolayout, чтобы правильно его обрамить. Я не могу найти способ сделать это из ViewDidLoad()
, чтобы прямоугольник правильно отображался при запуске. Я пробовал следующее:
- Использование
dayView.setNeedsLayout()
с последующим dayView.layoutIfNeeded()
перед тем, как я начну рисовать прямоугольник в viewDidLoad()
, но проверка с обеих сторон этих утверждений показывает dayView.bounds без изменений. - Рисование вида из
viewDidLayoutSubviews()
, что работает, но в результате мой прямоугольник рисуется 5 раз, так как viewDidLayoutSubviews()
вызывается для каждого подпредставления (у меня их 5), которое перерисовывается (соответствующее подпредставление, содержащее прямоугольник) перерисовывается при вызове 4 из 5) - это, кажется, расточительство ресурсов, наверняка есть лучший способ? - Рисование вида дважды в
ViewDidLoad()
, в надежде, что при первом принудительном отрисовке вид будет изменен, так что второй розыгрыш будет иметь доступ к новым границам после первого розыгрыша (отчаянно я знаю, но он все еще не работает).
Я надеюсь, что кто-то может помочь.
func drawGradient(object: UIView, rect: CGRect, slackX: Int, gradWidth: Int, yPos: Int) -> Void {
// the rectangle width and height set to fit within view with x & y border.
let gradientView = UIView(frame: rect)
let gradient = CAGradientLayer()
gradient.frame = gradientView.frame
gradient.colors = getDayGradientLocations().gradientCol
gradient.locations = getDayGradientLocations().gradientLoc
dayView.layer.addSublayer(gradient)
let civilDawn = getTimeAsProportionOfDay(time: tides.civilDawn) * Double(rect.height) + Double(yPos)
let path = UIBezierPath()
path.move(to: CGPoint(x: slackX, y: Int(civilDawn)))
path.addLine(to: CGPoint(x: slackX + Int(rect.width), y: Int(civilDawn)))
let shapeLayer = CAShapeLayer()
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = CGFloat(2)
let civilDusk = getTimeAsProportionOfDay(time: tides.civilDusk) * Double(rect.height) + Double(yPos)
path.move(to: CGPoint(x: slackX, y: Int(civilDusk)))
path.addLine(to: CGPoint(x: slackX + Int(rect.width), y: Int(civilDusk)))
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = CGFloat(2)
object.layer.addSublayer(shapeLayer)
drawLabel(object: object, rect: rect, slackX: slackX, offset: 15, time: tides.civilDawn)
drawLabel(object: object, rect: rect, slackX: slackX, offset: -15, time: tides.civilDusk)
}
