У меня возникла проблема с свойством graphOrigin в моем подклассе UIView. Когда я определил graphOrigin
как вычисленную переменную, он преобразует центральную точку супервизора в центральную точку этого вида и отображает график в центре экрана. Этого не происходит, когда переменная не вычисляется. Смотрите код и скриншот для рабочего случая:Как инициализация свойств подкласса UIView влияет на центр супервизора?
class GraphX_YCoordinateView: UIView {
var graphOrigin: CGPoint {
return convertPoint(center, fromView: superview)
}
@IBInspectable var scale: CGFloat = 50 {
didSet {
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
// Draw X-Y axes in the view
let axesDrawer = AxesDrawer(contentScaleFactor: contentScaleFactor)
axesDrawer.drawAxesInRect(bounds, origin: graphOrigin, pointsPerUnit: scale)
}
}
AxesDrawer это класс, который рисует осей в текущем виде, вот метод подписи для drawAxesInRect:
drawAxesInRect(bounds: CGRect, origin: CGPoint, pointsPerUnit: CGFloat)
И здесь это код и скриншот для случая, который не работает:
class GraphX_YCoordinateView: UIView {
var graphOrigin: CGPoint! {
didSet {
setNeedsDisplay()
}
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
graphOrigin = convertPoint(center, fromView: superview)
}
@IBInspectable var scale: CGFloat = 50 {
didSet {
setNeedsDisplay()
}
}
override func drawRect(rect: CGRect) {
// Draw X-Y axes
let axesDrawer = AxesDrawer(contentScaleFactor: contentScaleFactor)
axesDrawer.drawAxesInRect(bounds, origin: graphOrigin, pointsPerUnit: scale)
}
}
Так что буквально все, что я изменил, было инициализацией свойства graphOrigin на месте и вычислением его в инициализаторе. Во время редактирования этого кода я вообще не касался StoryBoard.
Я попытался инициализировать переменную инлайн:
var graphOrigin = convertPoint(center, fromView: superview)
Но это не было разрешено, потому что неявный self
не инициализируется, когда свойства вычисляются.
Может ли кто-нибудь объяснить, почему центр супервизора, кажется, меняет местоположение в зависимости от того, как инициализируется переменная?
Спасибо! Супер расстраивая порядок, в котором эти методы выполняются, делает отладку довольно сложной задачей. Нет ли способа сделать это в подклассе вида, только в контроллере представления? Похоже, плохая практика заключается в том, чтобы настроить представление из другого класса. – egracer
Вы можете сделать это в представлении. Просто перезапишите 'layoutSubviews', вызовите его супер и затем измените. – sahara108