Answers:
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)
bounds
而不是frame
,因为frame
undefined是未定义的transform
。
size
在使用中。
您可以执行此操作,它将始终有效:
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)。无论您的父视图中心设置为什么,这都将始终使子视图居中。
UIView.bounds
相对于视图本身(因此bounds.origin
最初为零),而UIView.center
在Superview的坐标系中指定。
在开始之前,我们只需要提醒一下原点是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()
}
}
这将创建此视图:黑色矩形的原点和中心确实适合与父级相同的坐标
现在让我们尝试添加另一个SubSubView的SubView,并为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;
您希望紫色矩形的原点与父矩形(黑色矩形)相同,但是在其下方,为什么呢?因为当您将视图添加到另一个视图时,subView框架“ world”现在是其父级BOUND RECTANGLE,如果您有一个视图,认为它在主屏幕上的所有子视图的坐标为(15,15),则左上角将是(0,0)
这就是为什么您需要始终通过其绑定矩形(即其subViews的“世界”)引用父对象的原因,因此请将该行修复为:
subSubView.frame.origin = subView.bounds.origin;
看到魔术,subSubview现在完全位于其父原点中:
因此,您喜欢“好吧,我只想以父母的观点为中心,这有什么大不了的?” 好吧,这没什么大不了的,您只需要通过执行以下操作即可将从其框架获取的父中心点“转换”为父边界中心:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
您实际上是在告诉他“以父母的视点为中心,并将其转换为subSubView世界”。
您将得到以下结果:
首先禁用子视图的自动调整大小
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
借助IOS9,您可以使用布局锚点API。
代码如下所示:
childview.centerXAnchor.constraintEqualToAnchor(parentView.centerXAnchor).active = true
childview.centerYAnchor.constraintEqualToAnchor(parentView.centerYAnchor).active = true
over CGPointMake
或or 的优点CGRect
是,使用这些方法,您可以将视图的中心设置为常数,但是使用此技术,您可以设置将永久保留的两个视图之间的关系,而无论parentview
更改如何。
在执行此操作之前,请务必确保:
self.view.addSubview(parentView)
self.view.addSubView(chidview)
并将translatesAutoresizingMaskIntoConstraints
每个视图的设置为false。
这将防止崩溃和自动布局干扰。
在视图和子视图中使用相同的中心是最简单的方法。你可以做这样的事情,
UIView *innerView = ....;
innerView.view.center = self.view.center;
[self.view addSubView:innerView];
与另一种溶液PureLayout使用autoCenterInSuperview
。
// ...
UIView *innerView = [UIView newAutoLayoutView];
innerView.backgroundColor = [UIColor greenColor];
[innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
[outerview addSubview:innerView];
[innerView autoCenterInSuperview];
它是这样的:
在c#或Xamarin.ios中,我们可以像这样使用
imageView.Center =新的CGPoint(tempView.Frame.Size.Width / 2,tempView.Frame.Size.Height / 2);
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