在AutoLayout视图上以编程方式居中自定义控件

时间:2015-11-20 06:58:37

标签: ios objective-c uiview

每当我执行HTTP请求时,我都将此控件用作活动指示器

https://github.com/gontovnik/DGActivityIndicatorView

以下是我的称呼方式

    let activityIndicator: DGActivityIndicatorView = DGActivityIndicatorView();
    activityIndicator.backgroundColor = UIColor.clearColor();
    activityIndicator.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.height);
    activityIndicator.size = 68;
    activityIndicator.tintColor = tintColor;
    //activityIndicator.type = DGActivityIndicatorAnimationType.BallClipRotatePulse;
    activityIndicator.startAnimating();

    view.addSubview(activityIndicator);

我在viewDidLoad上跟我的HTTP请求代码一起调用它。

但是,这会导致activityIndi​​cator位置不在中心,因为在viewDidLoad中,autolayout尚未完成布局。

我可以通过将代码放在viewDidAppear上来解决这个问题,并将activityIndi​​cator放在正确的位置。

但这很糟糕,因为HTTP请求只会在viewDidAppear上进行,这会浪费一个宝贵的秒。

我应该如何修改控件以使其自动居中?

此控件以Obj-C编码,我不熟悉DGActivityIndicatorView

4 个答案:

答案 0 :(得分:1)

要将视图放在另一个视图的中心,请使用以下代码行:

activityIndicator.center = self.view.center;

此外,您可以为activityIndicator创建全局属性。然后,您可以HTTP Request中的viewDidLoad开始,并在viewDidAppear中写下上一行,使activityIndicator居中。

答案 1 :(得分:0)

试试这个:

activityIndicator.center = CGPointMake(view.frame.size.width  / 2, 
                             view.frame.size.height / 2);

答案 2 :(得分:0)

试试这个:

activityIndicator.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addSubview(activityIndicator)

let xCenterConstraint = NSLayoutConstraint(item: activityIndicator, attribute: .CenterX, relatedBy: .Equal, toItem: self.view, attribute: .CenterX, multiplier: 1, constant: 0)
self.view..addConstraint(xCenterConstraint)

let yCenterConstraint = NSLayoutConstraint(item: activityIndicator, attribute: .CenterY, relatedBy: .Equal, toItem: self.view., attribute: .CenterY, multiplier: 1, constant: 0)
self.view..addConstraint(yCenterConstraint)

答案 3 :(得分:-1)

在控件本身中找到了一种方法

- (void)layoutSubviews {
    [super layoutSubviews];

    if (self.layer.sublayers != nil) {
        self.frame = self.superview.frame;
        self.layer.position = (CGPoint){CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)};
        self.layer.sublayers[0].position = (CGPoint){CGRectGetMidX(self.layer.bounds), CGRectGetMidY(self.layer.bounds)};
    }
}