2015-05-23 2 views
4

Могу ли я добавить виды автозапуска внутри родительских представлений, которые используют frame, bounds, autoresizingMask для размещения самой позиции?Автоопределение в макете вручную

Обычно в Интернете вы видите наоборот, но я не могу этого добиться.

Редактировать: Я добавил код для вас, ребята. Просто создайте новый проект Xcode с «Single View Application» и вставьте следующий код на ViewController.swift, созданный для нас.

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let custom = CustomManualLayoutSubviews() 
     let subview = UIView() 
     let childView = UIView() 

     custom.backgroundColor = UIColor.redColor() 
     subview.backgroundColor = UIColor.greenColor() 
     childView.backgroundColor = UIColor.blueColor() 

     custom.setTranslatesAutoresizingMaskIntoConstraints(false) 
     subview.setTranslatesAutoresizingMaskIntoConstraints(false) 
     childView.setTranslatesAutoresizingMaskIntoConstraints(false) 

     view.addSubview(custom) 
     custom.addSubview(subview) 
     subview.addSubview(childView) 

     pinToParent(view, child: custom) 
     pinToParent(subview, child: childView) 
    } 

    private func pinToParent(parent: UIView, child: UIView) { 
     parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-10-[view]-10-|", 
      options: .allZeros, metrics: nil, views: ["view" : child])) 
     parent.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-10-[view]-10-|", 
      options: .allZeros, metrics: nil, views: ["view" : child])) 
    } 
} 

class CustomManualLayoutSubviews : UIView { 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     for subview in subviews as! [UIView] { 
      subview.frame = bounds.rectByInsetting(dx: 10, dy: 10) 
      println("subview frame: \(subview)") 
     } 
    } 

} 

Как вы можете видеть из кода, подтаблица используется ручная компоновкой, а пользовательские и childView используют Autolayout. Но результатом является то, что childView, который использует автозапуск, не отображается на экране, и когда я его проверяю, я вижу, что он имеет ширину 0, 0 height.

Это то, что я получаю, вообще нет синей области. enter image description here

+0

Вы хотите сделать это с помощью кода? –

+0

Конечно! IB невозможно сделать. – mohamede1945

+0

В настоящее время вы можете сделать множество условных заявлений в IB. –

ответ

1

Да, но вы должны быть очень осторожны и достаточно ограничены.

Технически, если какой-либо вид в окне использует автоматическую компоновку, все в окне использует автоматическую компоновку. Просто эти ограничения генерируются автоматически из frame и autoresizingMask для просмотров, на которых осталось translatesAutoresizingMaskIntoConstraints.

Итак, вы должны убедиться, что ваши ограничения не мешают этим автоматически созданным ограничениям. Вы можете «повесить» вещи свободно от взглядов, используя translatesAutoresizingMaskIntoConstraints, но ваши ограничения не должны «толкать» или «тянуть» на эти виды. Представления с использованием translatesAutoresizingMaskIntoConstraints должны иметь полную свободу передвижения и калибровки.

Например, вы можете использовать ограничения для размещения кнопки на небольшом расстоянии от передней кромки вида контейнера, но если вы также ограничиваете задний край, вам лучше сделать защиту содержимого и сопротивление сжатию приоритеты очень низкие, чтобы они не пытались изменить ширину контейнера. Тем не менее, вы можете столкнуться с конфликтами. В автоматическом макете ширина просмотров не допускается отрицательной. Если в контейнере установлена ​​нулевая ширина, а кнопка имеет ненулевое расстояние до краев, то это будет конфликт. Таким образом, ограничение на задний фронт также должно иметь низкий приоритет, чтобы при необходимости его можно было сломать. (Или вы могли бы сделать это для передней кромки.)

Вы говорите, что не можете достичь использования автоматического макета в пределах вида с помощью translatesAutoresizingMaskIntoConstraints. Вам нужно будет объяснить, что вы пробовали, и что произошло, когда вы попытались, если хотите получить дополнительную помощь.

+0

Спасибо за ответ! Я добавил несколько кода, чтобы объяснить проблему более подробно. – mohamede1945

+0

Любые представления, чей фрейм, границы или выбранная вами позиция должны иметь 'translatesAutoresizingMaskIntoConstraints' значение true и не должны иметь ограничений, определяющих его положение. Кроме того, если вы установите эти свойства в переопределении 'layoutSubviews()', вы должны перезвонить супер * снова * после их изменения. Итак, в вашем случае не вызывайте 'subview.setTranslatesAutoresizingMaskIntoConstraints (false)' и добавляйте второй вызов 'super.layoutSubviews()' в конце 'layoutSubviews()'. –

+0

Большое спасибо. Если вы можете исправить вышеуказанный код и дать мне фиксированный, я приму его в качестве ответа. – mohamede1945

0

Эта ссылка может помочь:

Автокомпоновка программным

http://makeapppie.com/2014/07/26/the-swift-swift-tutorial-how-to-use-uiviews-with-auto-layout-programmatically/

Programatically сложением просмотров:

http://www.informit.com/articles/article.aspx?p=2015112&seqNum=3

Днем кодирования.

+0

Спасибо за ответ! Я добавил несколько кода, чтобы объяснить проблему более подробно. – mohamede1945

0

Да.Как только 1 вид имеет автоматическую компоновку, все окно включает автоматическую компоновку, перевод кадров в верхние, левые, ширина и высоту ограничений (с учетом маски авторезистации)

Так что, даже если вы можете подумать, что вы управляете рамкой или границами или центр, он будет переведен в автоматическую компоновку за кулисами, что делает ее на 100% совместимой с вами автоматически отображаемыми макетами.

+0

Спасибо за ответ! Я добавил несколько кода, чтобы объяснить проблему более подробно. – mohamede1945

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