如何集中UIView的子视图

时间:2012-06-28 20:00:04

标签: iphone objective-c ios ipad

我在UIView米内有一个UIView,我希望内部UIView始终位于外部{{1}}内,而不必调整宽度和高度。

我设置了支柱和弹簧,使其位于上/左/右/下,而不设置调整大小。但它仍然没有中心。有什么想法吗?

15 个答案:

答案 0 :(得分:268)

你可以这样做,它总是有效:

child.center = [parent convertPoint:parent.center fromView:parent.superview];

对于斯威夫特:

child.center = parent.convert(parent.center, from:parent.superview)

答案 1 :(得分:179)

目标C

yourSubView.center = CGPointMake(yourView.frame.size.width  / 2, 
                                 yourView.frame.size.height / 2);

夫特

yourSubView.center = CGPoint(x: yourView.frame.size.width  / 2,
                             y: yourView.frame.size.height / 2)

答案 2 :(得分:33)

在我们开始之前,让我们提醒原点是视图的左上角CGPoint。 关于观点和父母的重要事项。

让我们来看看这个简单的代码,一个视图控制器,它增加了它的视角:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        createDummyView()
        super.view.backgroundColor = UIColor.cyanColor();
    }

    func createDummyView(){
        var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50));
        super.view.addSubview(subView);
        view.backgroundColor = UIColor.blackColor()
    }

}

这将创建此视图: 黑色矩形原点和中心确实与它的父

符合相同的坐标

enter image description here

现在让我们尝试添加subView另一个SubSubView,并给subSubview提供与subView相同的源,但让subSubView成为subView的子视图

我们将添加此代码:

var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)

这就是结果:

enter image description here

由于这一行:

subSubView.frame.origin = subView.frame.origin;

你希望紫色矩形的原点与它的父级(黑色矩形)相同,但它在它之下,为什么会这样? 因为当您将视图添加到另一个视图时,subView框架" world"现在是它的父母BOUND RECTANGLE,如果你有一个观点,它在主屏幕上的原点是在所有它的子视图的坐标(15,15),左上角将是是(0,0)

这就是为什么你需要总是通过它的约束矩形来引用父元素,这是" world"在它的子视图中,我们将此行修复为:

subSubView.frame.origin = subView.bounds.origin;

看到魔术,subSubview现在正好位于它的父源:

enter image description here

所以,你喜欢"好吧我只想通过父母的观点来看待我的观点,这是什么大不了的事?" 好吧,这不是什么大问题,你只需要翻译"父中心点从它的框架中取出到父级边界中心 通过这样做:

subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);

你实际上是在告诉他"带父母查看中心,并将其转换为subSubView世界"。

你会得到这个结果:

enter image description here

答案 3 :(得分:26)

我会用:

self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
                                    CGRectGetMidY(self.parentView.bounds));

我想使用CGRect选项......

SWIFT 3:

self.childView.center = CGPoint(x: self.parentView.bounds.midX,
                                        y: self.parentView.bounds.midY);

答案 4 :(得分:20)

1。如果您启用了autolayout:

  • 提示:要使用autolayout将视图居中于另一个视图,您可以对共享至少一个父视图的任意两个视图使用相同的代码。

首先禁用子视图自动调整

UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
  1. 如果您是UIView + Autolayout或Purelayout

    [view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
    [view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
    
  2. 如果您只使用UIKit级自动布局方法:

    [view1 addConstraints:({
        @[ [NSLayoutConstraint
           constraintWithItem:view1
           attribute:NSLayoutAttributeCenterX
           relatedBy:NSLayoutRelationEqual
           toItem:view2
           attribute:NSLayoutAttributeCenterX
           multiplier:1.f constant:0.f],
    
           [NSLayoutConstraint
            constraintWithItem:view1
            attribute:NSLayoutAttributeCenterY
            relatedBy:NSLayoutRelationEqual
            toItem:view2
            attribute:NSLayoutAttributeCenterY
            multiplier:1.f constant:0.f] ];
    })];
    
  3. 2。没有自动布局:

    我更喜欢:

    UIView *parentView, *childView;
    [childView setFrame:({
        CGRect frame = childView.frame;
    
        frame.origin.x = (parentView.frame.size.width - frame.size.width) / 2.0;
        frame.origin.y = (parentView.frame.size.height - frame.size.height) / 2.0;
    
        CGRectIntegral(frame);
    })];
    

答案 5 :(得分:12)

最简单的方法:

child.center = parent.center

答案 6 :(得分:8)

enter image description here

将此自动调整遮罩设置为内部视图。

答案 7 :(得分:7)

使用IOS9,您可以使用布局锚API。

代码如下所示:

childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true

这优于CGPointMakeCGRect的优点是,使用这些方法,您将视图的中心设置为常量,但是使用此技术,您将在两个视图之间设置关系,永远坚持,无论parentview如何变化。

在你这样做之前一定要确定:

        self.view.addSubview(parentView)
        self.view.addSubView(chidview)

并将每个视图的translatesAutoresizingMaskIntoConstraints设置为false。

这可以防止崩溃和AutoLayout干扰。

答案 8 :(得分:7)

您可以使用

yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))

并在Swift 3.0中

yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)

答案 9 :(得分:5)

在视图和子视图中使用相同的中心是最简单的方法。你可以这样做,

UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];

答案 10 :(得分:4)

PureLayout使用autoCenterInSuperview的另一种解决方案。

// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];

[outerview addSubview:innerView];

[innerView autoCenterInSuperview];

这就是它的样子:

Center with PureLayout

答案 11 :(得分:1)

我会用:

child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)

这简单,简短,甜美。如果您使用上面的@Hejazi答案,parent.center设置为除(0,0)以外的任何其他内容,则您的子视图将不会居中!

答案 12 :(得分:1)

func callAlertView() {

    UIView.animate(withDuration: 0, animations: {
        let H = self.view.frame.height * 0.4
        let W = self.view.frame.width * 0.9
        let X = self.view.bounds.midX - (W/2)
        let Y = self.view.bounds.midY - (H/2)
        self.alertView.frame = CGRect(x:X, y: Y, width: W, height: H)
        self.alertView.layer.borderWidth = 1
        self.alertView.layer.borderColor = UIColor.red.cgColor
        self.alertView.layer.cornerRadius = 16
        self.alertView.layer.masksToBounds = true
        self.view.addSubview(self.alertView)

    })


}// calculation works adjust H and W according to your requirement

答案 13 :(得分:1)

这对我有用

childView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true

答案 14 :(得分:0)

在c#或Xamarin.ios中,我们可以这样使用

imageView.Center =新的CGPoint(tempView.Frame.Size.Width / 2,                                  tempView.Frame.Size.Height / 2);