2015-08-11 2 views
2

Хорошо, поэтому в интерфейсном построителе (Main.storyboard) у меня есть containerView:UIView, встроенный в UIScrollView. Внутри в containerView я хочу создать дополнительные UIView для хранения блоков контента, таких как заголовок, тело и т. Д. Причиной для этого является то, что контент может прокручиваться по вертикали, но не по горизонтали.Определение ширины UIView с использованием автовыброса - SWIFT

Моя цель - использовать автозапуск для создания этих разных UIView. На данный момент контейнерView автоматически настраивает его ширину в зависимости от размера экрана используемого устройства, чтобы предотвратить горизонтальную прокрутку. Это делается с использованием созданного мной IBOutlet для ограничения ширины. В настоящее время она выглядит так:

@IBOutlet var containerView: UIView! 
@IBOutlet var containerViewWidthConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Prevents horizontal scrolling 
    containerViewWidthConstraint.constant = self.view.frame.size.width 

    createHeader() 
} 

Затем я создал функцию, называемую createheader{}, какие контакты с headerView:UIView в верхней части containerView и 8 баллов из любого края containerView:

func createHeader() { 
    //Create header 
    let headerView = UIView() 
    headerView.backgroundColor = UIColor.blueColor() 
    self.containerView.addSubview(headerView) 

    //Create header constraints 
    let leftMargin = NSLayoutConstraint(item: headerView, attribute: .Leading, relatedBy: .Equal, toItem: containerView, attribute: .Leading, multiplier: 1.0, constant: 8) 
    let rightMargin = NSLayoutConstraint(item: containerView, attribute: .Trailing, relatedBy: .Equal, toItem: headerView, attribute: .Trailing, multiplier: 1.0, constant: 8) 
    let topMargin = NSLayoutConstraint(item: headerView, attribute: .Top, relatedBy: .Equal, toItem: containerView, attribute: .Top, multiplier: 1.0, constant: 70) 
    let heightConstraint = NSLayoutConstraint(item: headerView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 160) 

    //Activate header constraints 
    headerView.setTranslatesAutoresizingMaskIntoConstraints(false) 
    NSLayoutConstraint.activateConstraints([leftMargin,rightMargin,topMargin,heightConstraint]) 

    println(headerView.frame.size.width) 
} 

Теперь так размер содержимого внутри headerView будет зависеть от размера экрана используемого устройства, я хочу иметь возможность создавать функции, которые определяют ширину содержимого в зависимости от размера ширины самого headerView. Однако каждый раз, когда я пытаюсь захватить ширину headerView с помощью:

println(headerView.frame.size.width) 

возвращает нулевое значение, которое, очевидно, не так, потому что он по-прежнему создает сине-фон headerView в соответствии с вышеуказанными ограничениями.

Почему SWIFT не признает, что ширина headerView имеет ширину? И как я могу захватить ширину headerView?

+0

Как раз сейчас я связываюсь с 'containerView', чтобы захватить ширину:' (containerView.frame.size.width - 16) '. Я до сих пор не понимаю, почему «headerView» распознается как имеющий ширину ... – Yonny

+0

Почему бы вам просто не добавить ограничения для вашего нового содержимого внутри «headerView»? – dGambit

+0

Это план, но как я могу, если 'headerView' признан не имеющим ширины? Например, я хотел разместить квадратное изображение, которое автоматически изменяется и центрируется внутри 'headerView'. Это делается с использованием ограничения соотношения сторон 1: 1 и двух равных горизонтальных ограничений, одного '.Trailing' и одного' .Leading'. Но когда я пошел создавать горизонтальные ограничения, относящиеся к ширине 'headerView' ...' headerView.frame.size.width/3.5', это значение возвращалось как 0.0 – Yonny

ответ

3

После установки ограничений вам необходимо позвонить layoutIfNeeded, если вы хотите немедленно обновить фреймы.

func createHeader() { 
    //Create header 
    let headerView = UIView() 
    headerView.backgroundColor = UIColor.blueColor() 
    self.containerView.addSubview(headerView) 

    ... 

    //Activate header constraints 
    headerView.setTranslatesAutoresizingMaskIntoConstraints(false) 
    NSLayoutConstraint.activateConstraints([leftMargin,rightMargin,topMargin,heightConstraint]) 

    self.containerView.layoutIfNeeded() // Updates the frames 
    println(headerView.frame.size.width) // Will output the correct width 
} 

Обратите внимание, что это будет происходить автоматически на следующей итерации цикла UI, который, однако, не полезно для вас, если вы хотите сразу увидеть эффект.

+0

Это сработало ... Спасибо! – Yonny