Как бороться с безопасной областью при использовании классов размеров? - PullRequest
2 голосов
/ 12 июня 2019

Я только что создал простое красное представление и создал для него 4 ограничения (сверху, слева, справа, снизу). Я пытаюсь создать адаптивный макет, используя классы размеров, но не могу добиться правильного макета в ориентации "альбомная ориентация":

  1. В портретном режиме все правильно. Нижний, левый, правый края к краям суперпредставления, верхний край к вершине безопасной области.
  2. В ландшафтном левом режиме все правильно. Верх, правый край к краям суперпредставлений, левый и нижний к краям безопасной области.
  3. Но в альбомном режиме верстка неверна. Я ожидаю, что левый край будет равен левому краю суперпредставления, но на самом деле он равен безопасной области. То же самое с правым краем: я ожидаю, что он будет равен краю безопасной области, но на самом деле он равен краю суперпредставления. Как исправить что?

Interface Builder Screenshot Portrait Mode Landscape Left Landscape Right

Ответы [ 4 ]

1 голос
/ 21 июня 2019

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

импорт UIKit

класс ViewController: UIViewController {

@IBOutlet weak var conTrailing: NSLayoutConstraint!
@IBOutlet weak var conLeading: NSLayoutConstraint!
override func viewDidLoad() {
    super.viewDidLoad()


}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
     self.setOrientationAllignment()
}

func setOrientationAllignment()
{
    switch UIDevice.current.orientation{

    case .portrait:
        self.conLeading.constant = 0
        self.conTrailing.constant = 0
        break
    case .landscapeLeft:
        self.conLeading.constant = 40
        self.conTrailing.constant = 0
        break

    case .landscapeRight:
        self.conLeading.constant = 00
        self.conTrailing.constant = 40
        break
    default:
        break
    }
    self.view.layoutSubviews() //  no  need  now
    self.view.layoutIfNeeded()
}


override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    self.setOrientationAllignment()
}

}

enter image description here

0 голосов
/ 20 июня 2019

Я борюсь с вращением устройства, используя левый, правый, верхний, нижний якоря.

Для правильного пейзажа вы должны быть спокойны за верхний край и строку состояния.

Если вы правильно понимаете иерархию своих представлений, вы можете использовать этот пример кода:

        let deleteButtonImage = UIImage(named: "DeleteButton") as UIImage?  
        let deleteButtonImageSize: CGSize = CGSize(width: 295, height: 45)
        let deleteButton = UIButton(type: UIButton.ButtonType.custom)
        deleteButton.translatesAutoresizingMaskIntoConstraints = false
        deleteButton.tintColor = .white
        deleteButton.frame = CGRect(x: 0, y: 0, width: 250, height: 135)
        deleteButton.setImage(deleteButtonImage, for: .normal)

        deleteButton.imageEdgeInsets = UIEdgeInsets(
            top: (deleteButton.frame.size.height - deleteButtonImageSize.height) / 2,
            left: (deleteButton.frame.size.width - deleteButtonImageSize.width) / 2.5,
            bottom: (deleteButton.frame.size.height - deleteButtonImageSize.height) / 2,
            right: (deleteButton.frame.size.width - deleteButtonImageSize.width) / 2.5)


        scrollView.addSubview(deleteButton)

        deleteButton.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
        deleteButton.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: -150).isActive = true
        deleteButton.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 370).isActive = true
        deleteButton.widthAnchor.constraint(equalTo: self.scrollView.safeAreaLayoutGuide.widthAnchor).isActive = true
        deleteButton.heightAnchor.constraint(equalToConstant: 45).isActive = true

   }
0 голосов
/ 21 июня 2019

Установите верхнее, левое и правое поля равными 0 и выровняйте по Безопасная зона .и снизу до 0 с Superview .

change safe area to superview

0 голосов
/ 18 июня 2019

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

Давайте рассмотрим 2 ограничения переднего края красного представления: 1) Передний край красного представления равен переднему краю суперпредставления 2) Красного представленияпередний фронт равен SafeArea

Все ограничения имеют приоритет по умолчанию 999

. Тогда, что вы можете сделать в вашем контроллере вида:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    let lowPriority = UILayoutPriority(rawValue: 250)
    let highPriority = UILayoutPriority(rawValue: 999)

    switch UIDevice.current.orientation {
    case .landscapeLeft:
        leftEdgeToSafeAreaConstraint.priority = highPriority
        rightEdgeToSafeAreaConstraint.priority = lowPriority

        leftEdgeToSuperviewConstraint.priority = lowPriority
        rightEdgeToSuperviewConstraint.priority = highPriority
    case .landscapeRight:
        leftEdgeToSafeAreaConstraint.priority = lowPriority
        rightEdgeToSafeAreaConstraint.priority = highPriority

        leftEdgeToSuperviewConstraint.priority = highPriority
        rightEdgeToSuperviewConstraint.priority = lowPriority
    default:
        leftEdgeToSafeAreaConstraint.priority = highPriority
        rightEdgeToSafeAreaConstraint.priority = highPriority

        leftEdgeToSuperviewConstraint.priority = lowPriority
        rightEdgeToSuperviewConstraint.priority = lowPriority
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...