我有一个UIView
嵌套在另一个UIView
中,我希望内部的UIView
始终居中于外部的UIView
中,而无需调整宽度和高度。
我已经设置了支撑和弹簧效果,使其位于顶部/左侧/右侧/底部,但没有设置大小调整。但它仍然没有居中。有什么想法吗?
我有一个UIView
嵌套在另一个UIView
中,我希望内部的UIView
始终居中于外部的UIView
中,而无需调整宽度和高度。
我已经设置了支撑和弹簧效果,使其位于顶部/左侧/右侧/底部,但没有设置大小调整。但它仍然没有居中。有什么想法吗?
你可以这样做,并且它总是有效的:
child.center = [parent convertPoint:parent.center fromView:parent.superview];
对于 Swift:
child.center = parent.convert(parent.center, from:parent.superview)
child.center = parent.center
。我会使用 child.center = CGPointMake(parent.bounds.height/2, parent.bounds.width/2)
。这将始终使您的子视图居中,而不管您的父视图中心设置为何。 - Old NameUIView.bounds
是相对于 视图本身 的(因此 bounds.origin
最初为零),而 UIView.center
则是在 父视图 的坐标系中指定的。 - HejaziyourSubView.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)
transform
,就应该使用bounds
而不是frame
,因为如果使用frame
会得到未定义的结果。 - omzsize
被使用。 - Peter DeWeeseCGPoint
。
了解视图和其父视图之间的重要关系。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()
}
}
这将创建此视图: 黑色矩形的原点和中心与其父视图的坐标相同
现在让我们尝试添加另一个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)
这是结果:
由于这行代码:
subSubView.frame.origin = subView.frame.origin;
你希望紫色矩形的起点与它的父视图(黑色矩形)相同,但实际上它却在其下方。为什么会这样呢? 因为当将一个视图添加到另一个视图中时,子视图的框架“世界”现在是其父视图的BOUND RECTANGLE(边界矩形),如果你有一个视图,在主屏幕上的原点坐标为(15,15),那么对于它的所有子视图而言,左上角将是(0,0)。
这就是为什么你需要始终使用其父视图的BOUND RECTANGLE来引用它,这是它的子视图的“世界”,让我们将这一行修正为:
subSubView.frame.origin = subView.bounds.origin;
注意看,子视图现在恰好位于其父视图的原点位置:
所以,你可能会认为:“好吧,我只是想让我的视图相对于父视图居中,有什么大不了的?” 事实上,这并不复杂,你只需要将父视图中心点从它的frame转换为parent's bounds center即可,示例代码如下:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
你实际上是在告诉他:“将父视图中心转换为subSubView世界”。
然后你会得到这个结果:
我会使用:
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);
首先禁用子视图的自动调整大小。
UIView *view1, *view2;
[childview setTranslatesAutoresizingMaskIntoConstraints:NO];
如果您正在使用UIView+Autolayout或Purelayout:
[view1 autoAlignAxis:ALAxisHorizontal toSameAxisOfView:view2];
[view1 autoAlignAxis:ALAxisVertical toSameAxisOfView:view2];
如果你仅使用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] ];
})];
我更喜欢:
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);
})];
CGRectIntegral
更加优雅。 - Cemal Eker最简单的方法:
child.center = parent.center
您可以使用
yourView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds))
在Swift 3.0中
yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
将此自动调整大小掩码设置为您的内部视图。
在IOS9中,您可以使用布局锚点API。
代码如下:
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true
CGPointMake
或CGRect
的方法,因为使用这些方法会将视图的中心设置为一个常量,但使用这种技术可以在两个视图之间建立一个永久保持的关系,无论parentview
如何更改。 self.view.addSubview(parentView)
self.view.addSubView(chidview)
还要为每个视图设置translatesAutoresizingMaskIntoConstraints
为false。
这将防止崩溃和AutoLayout干扰。
在视图和子视图中使用相同的中心是最简单的方法。你可以像这样做:
UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];