Получить центр экрана с учетом навигационной панели - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь центрировать UIActivityIndicator и повторно использовать его в моем приложении. Я столкнулся с проблемой, когда некоторые из моих представлений должны находиться под панелью навигации, а некоторые - нет. Это происходит из-за того, что индикатор активности ниже представления в центре для представлений, где представление не находится под панелью навигации. Например:

enter image description here

Все ответы в StackOverflow находятся под рисунком №2.

Я просто сделал расширение UIView, чтобы показать и скрыть индикатор активности, добавив его в качестве наложения подвид. Проверяя несколько сообщений в StackOverflow, я не нашел ничего, что могло бы дублировать этот вопрос.

У меня вопрос в рабочем приложении, как можно успешно центрировать это представление для обеих этих ситуаций, используя только одну функцию, но при этом поддерживать версию IOS до 9.3

Ответы [ 4 ]

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

В UIView есть методы для преобразования точек и кадров между различными системами координат вида (поддерживается в iOS 2.0+, https://developer.apple.com/documentation/uikit/uiview/1622424-convert).

extension UIView {

    func centerInContainingWindow() {
        guard let window = self.window else { return }

        let windowCenter = CGPoint(x: window.frame.midX, y: window.frame.midY)
        self.center = self.superview.convert(windowCenter, from: nil)
    }

}

A UIView определяет свои координаты относительно своего суперпредставления, поэтому centerInContainingWindow() использует UIView.convert(_:from:) для получения центра окна в координатах относительно его суперпредставления.

  • Рисунок # 1, вид под панелью навигации: вид заполняет все окно, поэтому центральная точка до и после преобразования будет одинаковой.
  • Изображение # 2, вид не под панелью навигации: вид заполняет только часть окна, поэтому центр окна после преобразования будет смещен, чтобы оставаться на том же месте на экране.
0 голосов
/ 04 мая 2018

Вы можете использовать это:

func setActivityIndicatorTo(view: UIView, indicator: UIActivityIndicatorView){

    indicator.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0))    

}

Или вы можете найти центр экрана ниже:

let w = UIScreen.main.bounds.width
let h = UIScreen.main.bounds.height
activity.center = CGPoint(x: w / 2, y: h / 2)
0 голосов
/ 07 мая 2018

SWIFT 3:

Расширение центрирует подпредставление в ключевом окне вашего делегата приложения ... делая его центрированным независимо от того, где оно находится в вашем приложении:

extension UIView {

    public func addSubviewScreenCenter() {
        if let keyWindow = UIApplication.shared.keyWindow {
            keyWindow.addSubview(self)
            self.center()
        }
    }

    public func removeFromWindowView() {
        if self.superview != nil {
            self.removeFromSuperview()
        }
    }
}
0 голосов
/ 04 мая 2018

Вы можете получить высоту экрана + верх и низ

 var height: CGFloat {
        let heightTop = UIApplication.shared.statusBarFrame.height + (
            (self.navigationController?.navigationBar.intrinsicContentSize.height) ?? 0)
        let heightBottom  = self.tabBarController?.tabBar.frame.height ?? 0
        return  UIScreen.main.bounds.height + (heightTop+heightBottom)
    }

// затем

indicator.center = CGPoint(x: self.view.frame.width/2.0, y: height/2.0 )

вы можете использовать safeAreaLayoutGuide это даст вам область видимого экрана

   let indicator: UIActivityIndicatorView = {
        let indicator =  UIActivityIndicatorView(activityIndicatorStyle: .gray)
        indicator.translatesAutoresizingMaskIntoConstraints = false
        return indicator
    }()

        self.view.addSubview(indicator)


    let safeAreaGuide = self.view.safeAreaLayoutGuide

    NSLayoutConstraint.activate([
        indicator.centerXAnchor.constraint(equalTo: saveAreaGuide.centerXAnchor),
        indicator.centerYAnchor.constraint(equalTo: saveAreaGuide.centerYAnchor)
        ])
...