通过导航栏考虑获取屏幕中心

Jos*_*art 10 xcode uiview centering swift

我试图集中一个UIActivityIndi​​cator并在我的应用程序中重用它.我正面临一个问题,我的一些观点必须在导航栏下,有些则不是.这恰好使我的活动指示器在视图不在导航栏下的视图中低于中心呈现.例如:

在此输入图像描述

StackOverflow上的所有答案似乎都属于图片#2.

我只是简单地扩展了UIView,通过将其添加为子视图叠加来显示和隐藏活动指示器.检查StackOverflow上的多个帖子,我没有发现任何会复制此问题的内容.

我的问题是,在一个生产应用程序中,如何只使用一个功能成功地将这个视图集中在这两种情况中,但仍支持IOS版本回9.3

Jos*_*art 7

SWIFT 3:

扩展将子视图集中在App委托的keyWindow中......无论您的应用程序位于何处,它都会居中:

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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*ish 5

你可以获得屏幕高度+顶部和底部

 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)
    }
Run Code Online (Sandbox Code Playgroud)

// 然后

indicator.center = CGPoint(x: self.view.frame.width/2.0, y: height/2.0 )
Run Code Online (Sandbox Code Playgroud)

你可以使用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)
        ])
Run Code Online (Sandbox Code Playgroud)