Как программно инициировать подпредставление, ограничения которого основаны на границах его суперпредставления - PullRequest
0 голосов
/ 07 мая 2018

У меня есть подкласс UIview, ограничения которого зависят от границ его суперпредставления. В приведенном примере, когда мои пользовательские UIviews инициализируются из Interface Builder, все позиционируется, как и ожидалось. Однако, когда он программно инициализируется из viewController, подпредставления устанавливаются до суперпредставления, а их ограничения игнорируются.
Есть ли способ инициализировать или обновить макет подпредставлений, когда известны границы суперпредставления?

class CustomView: UIView {

let firstSubview = UIView()
let secondSubview = UIView()

override init(frame: CGRect) {
    super.init(frame: frame)
    initialization()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initialization()
}

func initialization() {

    firstSubview.backgroundColor = UIColor.black
    addSubview(firstSubview)
    firstSubview.translatesAutoresizingMaskIntoConstraints = false
    firstSubview.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 20).isActive = true
    //....other autoLayout constraints for trailing, top and bottom anchors

    secondSubview.backgroundColor = UIColor.blue
    addSubview(secondSubview)
    secondSubview.translatesAutoresizingMaskIntoConstraints = false
    secondSubview.leadingAnchor.constraint(equalTo:self.leadingAnchor, constant: 20).isActive = true
    //....other autoLayout constraints for trailing, top and bottom anchors 
    }
}

вот viewController

class ViewController: UIViewController {

    let firstCustomView = CustomView(frame: CGRect.zero)
    @IBOutlet weak var secondCustomView UIView! //working with autoLayout constraints from IB


    override func viewDidLoad() {
    super.viewDidLoad()

    firstCustomView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(firstCustomView)
    firstCustomView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30)
    firstCustomView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200)
    firstCustomView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30)
    firstCustomView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200)
    }
 }

EDIT: Вот рабочий код с правильной активацией ограничений благодаря комментариям и помощи @ Sulthan.

override func viewDidLoad() {
  super.viewDidLoad()

  firstCustomView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(firstCustomView).isActive = true
  firstCustomView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30).isActive = true
  firstCustomView.topAnchor.constraint(equalTo: view.topAnchor, constant: 200).isActive = true
  firstCustomView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
  firstCustomView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -200).isActive = true 
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Также вы можете использовать маски авторазмера:

firstCustomView.frame = frame
firstCustomView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

После этого firstCustomView правильно изменит размер во фрейм viewController.

0 голосов
/ 07 мая 2018

Вы указываете ограничение ширины только для родительского представления

 firstCustomView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2/3).isActive = true

Вы должны установить другие ограничения, такие как высота и положение (вперед / назад, сверху / снизу)

Вы можете попробовать

firstCustomView.translatesAutoresizingMaskIntoConstraints = false
firstCustomView.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant:20.0)
firstCustomView.topAnchor.constraint(equalTo: view.topAnchor , constant:30.0).isActive = true
firstCustomView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 2/3).isActive = true    
firstCustomView.heightAnchor.constraint(equalToConstant: 200).isActive = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...