我有一个UIView
内部UIView
m,我希望内部UIView
始终位于外部内部的中心,而不必调整宽度和高度。
我已经设置了支柱和弹簧,使其位于顶部/左侧/右侧/底部,而无需设置调整大小。但它仍然没有居中。任何想法?
我有一个UIView
内部UIView
m,我希望内部UIView
始终位于外部内部的中心,而不必调整宽度和高度。
我已经设置了支柱和弹簧,使其位于顶部/左侧/右侧/底部,而无需设置调整大小。但它仍然没有居中。任何想法?
你可以这样做,它总是有效的:
child.center = [parent convertPoint:parent.center fromView:parent.superview];
对于斯威夫特:
child.center = parent.convert(parent.center, from:parent.superview)
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)
在开始之前,让我们提醒一下原点是视图的左上角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()
}
}
这将创建这个视图:黑色矩形的原点和中心确实适合与其父级相同的坐标
现在让我们尝试将 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)
这是结果:
因为这条线:
subSubView.frame.origin = subView.frame.origin;
您期望紫色矩形的原点与其父级(黑色矩形)相同,但它位于其下方,这是为什么呢?因为当您将视图添加到另一个视图时,子视图框架“世界”现在是它的父 BOUND RECTANGLE,如果您认为它在主屏幕上的原点在所有子视图的坐标 (15,15) 处,则左上角将是 (0,0)
这就是为什么你需要总是通过它的绑定矩形来引用父级,这是它的子视图的“世界”,让我们将此行修复为:
subSubView.frame.origin = subView.bounds.origin;
看看魔术,subSubview 现在正好位于它的父原点:
所以,你喜欢“好吧,我只想以我父母的观点为中心,有什么大不了的?” 好吧,这没什么大不了的,您只需要通过执行以下操作将从其框架中获取的父中心点“翻译”到父边界中心:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
您实际上是在告诉他“获取父母视图中心,并将其转换为 subSubView 世界”。
你会得到这个结果:
我会使用:
self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
CGRectGetMidY(self.parentView.bounds));
我喜欢使用CGRect
选项...
斯威夫特 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);
})];
最简单的方法:
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
与or相比,这样做的优势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];
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 = new CGPoint(tempView.Frame.Size.Width / 2, tempView.Frame.Size.Height / 2);
这对我有用
childView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true
我会使用:
child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
这很简单,简短而甜蜜。如果您在上面使用@Hejazi 的答案并parent.center
设置为您的子视图以外的任何内容,(0,0)
则不会居中!
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