2015-04-24 5 views
1

У меня возникла проблема с свойством 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) 
    } 

} 

Graph Is Centered

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) 
    } 
} 

Graph Not Centered

Так что буквально все, что я изменил, было инициализацией свойства graphOrigin на месте и вычислением его в инициализаторе. Во время редактирования этого кода я вообще не касался StoryBoard.

Я попытался инициализировать переменную инлайн:

var graphOrigin = convertPoint(center, fromView: superview) 

Но это не было разрешено, потому что неявный self не инициализируется, когда свойства вычисляются.

Может ли кто-нибудь объяснить, почему центр супервизора, кажется, меняет местоположение в зависимости от того, как инициализируется переменная?

ответ

1

Эта функция

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    graphOrigin = convertPoint(center, fromView: superview) 
} 

означает, что вы загружаете вид из XIb, и в это время размер мнение 600:600 (смотрите на свой XIb). Так что ваш graphOrigin = 300:300. Вот почему вы видите вторую картину.

Чтобы устранить эту проблему, вы должны вычислить graphOrigin после макета вида в viewDidLayout.

+0

Спасибо! Супер расстраивая порядок, в котором эти методы выполняются, делает отладку довольно сложной задачей. Нет ли способа сделать это в подклассе вида, только в контроллере представления? Похоже, плохая практика заключается в том, чтобы настроить представление из другого класса. – egracer

+0

Вы можете сделать это в представлении. Просто перезапишите 'layoutSubviews', вызовите его супер и затем измените. – sahara108

 Смежные вопросы

  • Нет связанных вопросов^_^