ios - 如何以编程方式使用自动布局将事件指示器定位到其 super View 的中心?

标签 ios autolayout uiactivityindicatorview

为什么以下代码无法将事件指示器定位到其父 View 的中心:

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc]
       initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

[self.mysuperview addSubview:activityIndicator];
[activityIndicator addConstraints:[NSLayoutConstraint 
                   constraintsWithVisualFormat:@"|-(>=20)-[view(==100)]-(>=20)-|"
                   options:NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
                   metrics:nil
                   views:@{@"view" : self.mysuperview}]];

事件指示器位于左上角的某个位置,绝对不在中心。

================== 更新: 找到的解决方案:我必须在创建指标后关闭自动调整大小约束,然后关闭所有给定工作的解决方案:

 [activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO];

我在@Vignesh 提供的链接上找到了它,所以我接受他/她的回答。

最佳答案

以下四个 Swift 5/iOS 12 代码示例展示了如何使用 UIActivityIndi​​catorView 置于 UIViewControllerUIView 中心自动布局

所有样本产生相同的结果,但根据您的需要和品味,您可以选择其中之一。

如果您的 UIActivityIndi​​catorView 的 super View 不是 self.view,您只需将每个 self.view 调用替换为您自己的 (展开)superview


1。 NSLayoutConstraint 初始化样式

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let indicatorView = UIActivityIndicatorView(style: .gray)
        indicatorView.isHidden = false
        indicatorView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(indicatorView)

        // Auto layout
        let horizontalConstraint = NSLayoutConstraint(item: indicatorView,
                                                      attribute: .centerX,
                                                      relatedBy: .equal,
                                                      toItem: self.view,
                                                      attribute: .centerX,
                                                      multiplier: 1,
                                                      constant: 0)
        let verticalConstraint = NSLayoutConstraint(item: indicatorView,
                                                    attribute: .centerY,
                                                    relatedBy: .equal,
                                                    toItem: self.view,
                                                    attribute: .centerY,
                                                    multiplier: 1,
                                                    constant: 0)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
        /*
         // You can replace NSLayoutConstraint activate(_:) call with the following lines:
         self.view.addConstraint(horizontalConstraint)
         self.view.addConstraint(verticalConstraint)
         */
    }

}

2。 UIViewAutoresizing 样式

Springs 和 Struts 会在运行时转换成相应的自动布局约束。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let indicatorView = UIActivityIndicatorView(style: .gray)
        indicatorView.isHidden = false
        indicatorView.translatesAutoresizingMaskIntoConstraints = true // default is true
        self.view.addSubview(indicatorView)

        // Springs and struts
        indicatorView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
        indicatorView.autoresizingMask = [
            .flexibleLeftMargin,
            .flexibleRightMargin,
            .flexibleTopMargin,
            .flexibleBottomMargin
        ]
    }

}

3。视觉格式语言风格

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let indicatorView = UIActivityIndicatorView(style: .gray)
        indicatorView.isHidden = false
        indicatorView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(indicatorView)

        // Auto layout
        let views = ["superview": self.view!, "indicatorView": indicatorView]
        let horizontalConstraints = NSLayoutConstraint
            .constraints(withVisualFormat: "H:[superview]-(<=0)-[indicatorView]",
                         options: .alignAllCenterY,
                         metrics: nil,
                         views: views)
        let verticalConstraints = NSLayoutConstraint
            .constraints(withVisualFormat: "V:[superview]-(<=0)-[indicatorView]",
                         options: .alignAllCenterX,
                         metrics: nil,
                         views: views)
        self.view.addConstraints(horizontalConstraints)
        self.view.addConstraints(verticalConstraints)
    }

}

4。 NSLayoutAnchor 样式(需要 iOS 9)

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let indicatorView = UIActivityIndicatorView(style: .gray)
        indicatorView.isHidden = false
        indicatorView.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(indicatorView)

        // Auto layout
        let horizontalConstraint = indicatorView
            .centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
        let verticalConstraint = indicatorView
            .centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
        NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
        /*
         // You can replace NSLayoutConstraint activate(_:) call with the following lines:
         self.view.addConstraint(horizontalConstraint)
         self.view.addConstraint(verticalConstraint)
         */
    }

}

关于ios - 如何以编程方式使用自动布局将事件指示器定位到其 super View 的中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19431286/

相关文章:

ios - UIActivityIndi​​catorView float 在 UITableView 之上

ios - UIActivityIndi​​cator 设置颜色在较旧的 iOS 版本上崩溃

ios - 模型类、json编码和继承

objective-c - 将 userInfo 添加到 NSURLConnection

ios - 在 Xcode 中强制 3.5"屏幕模式

ios - Interface Builder - 限制最大宽度和边距

ios - Storyboard和可扩展的 textView

android - 将 Xamarin.Forms.Color 转换为平台特定颜色

ios - UICollectionView(自动调整大小).reloadData() 将 contentOffset 重置为 0(顶部)

ios - 无法通过 Storyboard 动画化事件指示器