Положение UIView после ориентации устройства - PullRequest
0 голосов
/ 12 апреля 2020

Учтите, что представление добавляется в качестве подпредставления к основному представлению следующим образом:

override func viewDidLoad()
{
    super.viewDidLoad()
    let subview = UIView(frame: CGRect(x: 150, y: 350, width: 20, height: 20))
    subview.backgroundColor = UIColor.blue
    self.view.addSubview(subview)
}

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

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Самый простой способ - использовать ограничения вместо фиксированного фрейма для вашего вида. Код будет выглядеть примерно так:

override func viewDidLoad()
{
    super.viewDidLoad()
    let subview = UIView()

    /// You do not need to refer to self and UIColor, Swift does that for you.
    subview.backgroundColor = .blue
    view.addSubview(subview)

    /// Do not forget the following line
    subview.translatesAutoresizingMaskIntoConstraints = false

    /// Create and activate your constraints in one step.
    NSLayoutConstraint.activate([
        /// Set the height and width of your subview
        subview.heightAnchor.constraint(equalToConstant: 20),
        subview.widthAnchor.constraint(equalToConstant: 20),

        /// This centers the subview vertically and horizontally in the parent view
        subview.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        subview.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
}

Также вам следует изменить код, приведенный выше, например, создать метод, который устанавливает все и вызывать его внутри viewDidLoad.

0 голосов
/ 17 апреля 2020

Я нашел ответ:

 override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator)
{
    super.willTransition(to: newCollection, with: coordinator)
    //here, the distance (just before the orientation) between the subview's center and superview's center can be derived
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
{
    super.traitCollectionDidChange(previousTraitCollection)
    //here, the distance derived above can be used to set the subview to the desired position in it's superview
}

Я описал, как эти две функции работают в ответ на этот пост: Swift - Как обнаружить изменения ориентации

...