#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 , так что, если я смогу это сделать, вы тоже сможете 😉