如何居中UIView的子视图

我有一个UIView里面的UIView米,我想内部的UIView总是在外面的一个中心,而不必调整的宽度和高度。

我已经设置了支柱和弹簧,使其位于顶部/左侧/右侧/底部,而不设置resize。 但它仍然不居中。 任何想法?

尝试:

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

你可以做到这一点,它会一直工作:

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

在我们开始之前,让我们提醒一下,原点是视图的左上angularCGPoint 。 了解意见和父母是重要的事情。

让我们看看这个简单的代码,一个视图控制器,它增加了它的视图黑色方块:

 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() } } 

这将创build这个视图:黑色的矩形起点和中心确实适合与父母相同的坐标

在这里输入图像说明

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

我们将添加以下代码:

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

这就是结果:

在这里输入图像说明

由于这一行:

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

你期望紫色的矩形的起源与它的父母(黑色的矩形)相同,但它在它下面,为什么呢? 因为当你添加一个视图到另一个视图时,子视图框架“世界”现在是它的父BORD RECTANGLE,如果你有一个视图,它在主屏幕上的原点是坐标(15,15)所有它的子视图,左上angular将是(0,0)

这就是为什么你总是需要通过它的边界矩形来引用父对象,这是它的子视图的“世界”,让我们把这一行修改为:

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

看到魔术,subSubview现在完全位于它的父源:

在这里输入图像说明

所以,你喜欢“好吧,我只想让我父母的观点集中我的观点,有什么大不了的?” 好吧,这不是什么大不了的事情,你只需要将从框架中取出的父中心点“翻译”到父界边界就可以了:

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

你实际上告诉他“把父母视为中心,并将其转换成subSubView世界”。

你会得到这个结果:

在这里输入图像说明

1.如果您启用了自动布局function:

  • 提示:要使用自动布局在另一个视图中居中显示视图,可以为共享至less一个父视图的任意两个视图使用相同的代码。

首先禁用子视图自动调整

 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] ]; })]; 

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); })]; 

我会用:

 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); 

在这里输入图像说明

将此自动调整掩码设置为内部视图。

最简单的方法是:

 child.center = parent.center 

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

代码看起来像这样:

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

CGPointMakeCGRect相比,这样CGPointMake CGRect在于,通过这些方法,您可以将视图的中心设置为常量,但是使用这种技术,无论parentview视图如何更改,您都将在两个视图之间build立关系。

只要确保在做这件事之前:

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

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

这将防止崩溃和AutoLayout干扰。

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

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

PureLayout使用autoCenterInSuperview另一个解决scheme。

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

这是这样的:

以PureLayout为中心

我会用:

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

这很简单,简短而且甜美。 如果你使用上面的@ Hejazi的回答, parent.center被设置为(0,0)以外的任何东西,你的子视图将不会居中!

您可以使用

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

而在Swift 3.0中

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