Возможно ли получить размер представления из класса? (Swift)

#ios #swift

#iOS #swift

Вопрос:

Если вложенное представление класса MyClass добавляется в другое представление:

 secondView = MyClass() 
mainView.addSubview(secondView)
 

возможно ли получить размеры подвида из класса?

 secondView = MyClass()
mainView.addSubview(secondView)

class MyClass: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        // do whatever the view will need to show
        // *** can I get the view's dimensions here? <----------------------***
        // e.g., draw a diagonal line 
        //  from top left corner to bottom right corner

        // self.bounds and self.frame return (0, 0, 0, 0) here
    }
}
 

Или они должны быть каким-то образом переданы из представления, создающего его ( mainView )?

Ответ №1:

Вы не можете надежно получить размер представления в init. Размер представления может измениться. Поэтому вам следует либо выполнить любой чертеж, который вам нужен, в drawrect, либо, если вы используете CALayer, изменить размер вашего слоя так, чтобы layoutSubviews у вас были границы вашего вида, и затем вы можете использовать это для установки рамки вашего подслоя или подвидов. https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews
https://developer.apple.com/documentation/uikit/uiview/1622529-drawrect Вот игровая площадка с простым линейным примером.

 import UIKit
import Combine
import PlaygroundSupport

final class XView: UIView {
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        UIColor.red.setStroke()
        let path = UIBezierPath()
        path.lineWidth = 10
        path.move(to: rect.origin)
        path.addLine(to: .init(x: rect.maxX, y: rect.maxY))
        path.stroke()
    }
}
let v = XView()
v.frame = .init(origin: .zero, size: .init(width: 300, height: 300))
PlaygroundPage.current.liveView = XView()
 

Если вам нужна модная версия, посмотрите Мой проект на GitHub здесь:
https://github.com/joshuajhomann/pathmorpher/tree/master/final

Комментарии:

1. Теперь я еще больше запутался! (Это немного отличается от моих старых дней Fortran и C… лол). Как бы мне нарисовать эту диагональную линию? Или, скажем, заполненное поле, которое было вдвое меньше по высоте и ширине и центрировалось в представлении?

2. Я обновил ответ на примере. Кроме того, я старый программист на C / C , так что, если я смогу это сделать, вы тоже сможете 😉