Установка источника контейнера для другой проблемы контейнера (Swift 4.2) - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь установить происхождение и ширину / высоту одного UIView (красный) для второго UIView (синий).

Я звоню UIView.frame.origin или size, и по какой-то причине источник y не работает.

Я также пытался использовать ограничения макета (см. Закомментированное ниже), но это переопределяет мой синий полностью ограниченный вид.

Затем у меня есть кнопка, которая анимирует красный вид насбоку, чтобы вы могли видеть синий вид внизу, но я не могу заставить их выстроиться в линию, чтобы начать с.Ниже мой код.В конструкторе интерфейсов оба UIViews настроены как контейнеры.Синий полностью ограничен автоматической компоновкой, а красный не имеет ограничений.

import UIKit

class ViewController: UIViewController 
{

    @IBOutlet weak var blueContainer: UIView!
    @IBOutlet weak var redContainer: UIView!
    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        print(redContainer.frame)

        redContainer.frame.origin.x = view.frame.width/2
        redContainer.frame.size.width = view.frame.width

        //try to line up y with origin and size
        redContainer.frame.origin.y = blueContainer.frame.origin.y
        redContainer.frame.size.height = blueContainer.frame.size.height

        //also tried by using constraints
        //redContainer.topAnchor.constraint(equalTo: blueContainer.topAnchor).isActive = true
        //redContainer.heightAnchor.constraint(equalTo: blueContainer.heightAnchor).isActive = true

        print(redContainer.frame)
    }

    @IBAction func slideRed(_ sender: Any) {
        if redContainer.frame.origin.x == 0 {
            UIView.animate(withDuration: 0.5) {
                self.redContainer.frame.origin.x = self.view.frame.width/2
            }
            button.setTitle("Come Back Red!", for: .normal)
        } else {
            UIView.animate(withDuration: 0.5) {
                self.redContainer.frame.origin.x = 0
            }
            button.setTitle("Go Away Red!", for: .normal)
        }
    }
}

1 Ответ

2 голосов
/ 01 апреля 2019

ViewDidLoad не гарантирует, что представление изложило свои ограничения.Поэтому, когда blueContainer frame и size равны zero, вы не увидите никакого эффекта на redContainer.Вы должны использовать viewDidLayoutSubviews, чтобы получить правильные frame и size от blueContainer.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    redContainer.frame.origin.x = view.frame.width/2
    redContainer.frame.size.width = view.frame.width

    //try to line up y with origin and size
    redContainer.frame.origin.y = blueContainer.frame.origin.y
    redContainer.frame.size.height = blueContainer.frame.size.height
}
...