2015-10-15 6 views
1

Я создал пользовательский UIView, который загружается из файла XIB. Затем я добавляю представление в стеке и устанавливаю ограничение ширины элемента.Swift: Пользовательский UIView не изменяет размер до ограничений

Это прекрасно работает, если я делаю это с раскадровки, однако, если я делаю это из Swift, я не могу заставить взгляд растянуться до ограничения. В представлении стека выделяется пространство для представления, но представление не растягивается в пространстве.

Пользовательские смотреть быстрый код:

import Foundation 
import UIKit 

@IBDesignable class TabButton: UIView { 

@IBOutlet weak var label: UILabel! 

@IBInspectable var TabText: String? { 
    get { 
     return label.text 
    } 
    set(TabText) { 
     label.text = TabText 
     label.sizeToFit() 
    } 
} 

override func intrinsicContentSize() -> CGSize { 
    return CGSize(width: UIViewNoIntrinsicMetric, height: UIViewNoIntrinsicMetric) 
} 

override init(frame: CGRect) { 
    // 1. setup any properties here 

    // 2. call super.init(frame:) 
    super.init(frame: frame) 

    // 3. Setup view from .xib file 
    xibSetup() 
} 

required init(coder aDecoder: NSCoder) { 
    // 1. setup any properties here 

    // 2. call super.init(coder:) 
    super.init(coder: aDecoder)! 

    // 3. Setup view from .xib file 
    xibSetup() 
} 

// Our custom view from the XIB file 
var view: UIView! 

func xibSetup() { 
    view = loadViewFromNib() 

    // use bounds not frame or it'll be offset 
    view.frame = bounds 

    // Make the view stretch with containing view 
    view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight] 

    // Adding custom subview on top of our view (over any custom drawing > see note below) 
    addSubview(view) 
} 

func loadViewFromNib() -> UIView { 

    let bundle = NSBundle(forClass: self.dynamicType) 
    let nib = UINib(nibName: "TabButton", bundle: bundle) 
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView 

    self.roundCorners([.TopLeft, .TopRight], radius: 10) 

    return view 
} 
} 

И это ViewController, что добавляет вид (tabButton) к stackview (TabBar):

@IBOutlet weak var tabBar: UIStackView! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let tabButton = TabButton(frame: CGRectZero) 
    tabButton.label.text = "All Videos" 

    tabButton.backgroundColor = UIColor.blackColor() 

    let widthConstraint = NSLayoutConstraint(item: tabButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 100) 
    tabButton.addConstraint(widthConstraint) 

    tabBar.insertArrangedSubview(tabButton, atIndex: 0) 
} 

Я хочу tabButton «игнорировать «это кадр и изменение размера в соответствии с высотой стека и ограничение ширины, которое я устанавливаю.

Что мне не хватает?

UPDATE:

Мои ограничения на настраиваемое представление (в основном только вид с этикеткой - Но я планирую использовать это с более сложные макеты, а):

My constraints

+0

вы хотите добавить ограничения программно, да? –

+0

Да, так как представление добавляется программно. – Whooper

ответ

0

По крайней мере, вы должны определить размер вашего пользовательского представления с помощью sizeThatFits: . К сожалению, я не вижу ваших ограничений макета, чтобы сказать, с ними все в порядке.

+0

Спасибо, я добавил скриншот моих ограничений для пользовательского представления вопроса. Как определить размер пользовательского вида в SizeThatFits? Я предполагаю, что это основано на ограничениях, установленных супервидом? – Whooper

+0

Выглядит обычным. Как насчет sizeThatFits? Вы пробовали это? –

+0

Да, ничего не меняет. Если я установил размер рамки для tabButton, используя CGRectMake, вместо использования CGRectZero, я могу изменить размер изображения должным образом. Но я хочу сделать это с ограничением ширины. – Whooper

0

Представление стека управляет компоновкой его подзонов и автоматически применяет для вас макеты. Попробуйте добавить tabButton без каких-либо ограничений на StackView.

OK, а затем проверить эту thread

Надеется, что это решит проблему.

+0

Но я хочу, чтобы пользовательский вид имел определенный размер, а другой вид в стеке, чтобы заполнить остальные. Вот почему я должен установить ширину пользовательского представления. – Whooper

1

Попробуйте это:

let widthConstraint = NSLayoutConstraint (item: your_item_here, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: your_value_here) 
self.view.addConstraint(widthConstraint) 
+0

При добавлении этого ничего не происходит. Я делаю это после того, как я добавил элемент в стек. Если я сделаю это, прежде чем я получу ошибку времени выполнения. «NSInternalInconsistencyException», причина: «Невозможно настроить макет с иерархией представлений, не подготовленной для ограничения». – Whooper

+0

Можете ли вы вставить здесь изображение вашего результата? –

+0

http://postimg.org/image/nty10iqk5/ Неоновая зеленая полоса - это другой вид в стеке. Стекло имеет одинаковое пространство на каждом сайте, поэтому мы видим, что ограничение работает, как должно, оно просто не изменяет размер содержимого пользовательского представления. – Whooper