2016-05-17 1 views
0

Так что, в основном, у меня есть UITextView, что я хочу сосредоточиться на своем UIView. Вот мой взгляд контроллер код ниже:Центр раскадровки Просмотров в автостраде

import UIKit 

class OpeningScreenViewController: UIViewController { 

    @IBOutlet weak var topBarUIView: UIView! 
    @IBOutlet weak var topViewTextView: UITextView! 

    override func viewDidAppear(animated: Bool) { 
     let superViewWidth = view.frame.size.width 
     let superViewHeight = view.frame.size.height 

    //creating the top bar 
     topBarUIView.frame = CGRect(x: 0, y: 0, width: superViewWidth, height: superViewHeight * 0.1) 
     topBarUIView.backgroundColor = UIColor.grayColor().colorWithAlphaComponent(0.5) 

    //adding text to the top bar 
     topViewTextView.frame = CGRectMake(0, 0, superViewWidth, superViewHeight * 0.1) 
     topViewTextView.backgroundColor = UIColor.blueColor() 
     topViewTextView.text = "Hello World" 
     topViewTextView.textAlignment = NSTextAlignment.Center 
     topViewTextView.font = UIFont(name: "Arial", size: 24)   
    }  
} 

изменить непрозрачность моего фона зрения на 50% и TextView на цвет фона синий, но когда я запускаю это, синий фон находится в пределах UIView, как 10 пикселов с одной стороны, а 20 - с другой. Я не знаю, почему.

Я установил его в раскадровке, а cnt-перетащил его, а затем изменил свойства просмотров в viewDidAppear, чтобы переопределить раскадровку.

Также я пытался делать такие вещи, как:

override func viewDidAppear(animated: Bool) {  
    // Get the superview's layout 
    let margins = view.layoutMarginsGuide 

    // Pin the leading edge of myView to the margin's leading edge 
    topBarUIView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true 

    // Pin the trailing edge of myView to the margin's trailing edge 
    topBarUIView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 

    // Give myView a 1:2 aspect ratio 
    topBarUIView.heightAnchor.constraintEqualToAnchor(topBarUIView.widthAnchor, multiplier: 2.0) 
} 

И получил странную ошибку о том, что ограничения макета были возникли проблемы.

Было бы проще установить высоту, ширину и начальную точку зрения отдельно? Если да, то как я могу сделать что-то вроде этого псевдокода:

topBar.startingPoint = (x,y) 
topBar.height = this 
topBar.width = this 

т.д.

+0

Почему вы не подаете ограничений в stroryboard ?? –

+0

Меня попросили сделать это как можно более программно, и я старался избегать раскадровки. – dnaland

+0

Просьба использовать автозапуск или это будет беспорядок для вас, чтобы обращаться. Я не знаю, если его требование к проекту не использовать автозапуск, или кто-то сказал вам. Если кто-то сказал, что я рассказываю вам по опыту, это неправильное направление, которое вы следуют –

ответ

1

В современном приложении вы никогда не должны быть настройки .frame непосредственно. Особенно не в viewDidAppear - ваши макеты меняются при повороте, а в режиме «Сползание» или «Сплит» многозадачность просмотра пока остаются видимыми.

Правильная вещь - всегда использовать автоматическую компоновку и, как правило, применять все ограничения автоматического макета в Interface Builder, настраивая по мере необходимости класс размера и просматривая их там. Любые отклонения могут быть исправлены намного легче таким образом. Отличные уроки можно найти на raywenderlich.com:

+0

Понял. Вот что, это всего лишь приложение для iPhone - и более или менее упражнение в программном отношении делает представления с раскадровки как просто прототипом. Может быть, мы делаем это как упражнение, чтобы показать нам, как трудно или немыслимо, какой подход, я не уверен. Мне просто интересно, почему текстовое поле не подходит к кадру, который я установил. Я неправильно установил фрейм? Если я поместил код в viewDidLoad, тогда раскадровка переработает код, поэтому он был в viewDidAppear. Но опять же, я не эксперт, а просто новый студент, и мне просто интересно. – dnaland

+0

Ваши изменения в кадре перезаписываются следующим проходом Auto Layout, который происходит, как только любое представление аннулирует его содержимое или позицию. Если вы действительно хотите бороться с фреймворком, вы можете сделать видимые изменения кадров в переопределении 'viewDidLayoutSubviews()' или полностью отключить автомат. –