Iphone 如何将UIView的子视图居中

Iphone 如何将UIView的子视图居中,iphone,objective-c,ios,ipad,Iphone,Objective C,Ios,Ipad,我有一个UIView在UIViewm的内部,我希望内部UIView始终位于外部视图的中心,而不必调整宽度和高度 我已经设置了支柱和弹簧,使其位于顶部/左侧/右侧/底部,而无需设置调整大小。但它仍然不居中。有什么想法吗?1。如果已启用自动布局: 提示:若要使用autolayout将视图居中于另一个视图上,您可以对至少共享一个父视图的任意两个视图使用相同的代码 首先,禁用子视图自动调整大小 UIView *view1, *view2; [childview setTranslatesAutore

我有一个
UIView
UIView
m的内部,我希望内部
UIView
始终位于外部视图的中心,而不必调整宽度和高度

我已经设置了支柱和弹簧,使其位于顶部/左侧/右侧/底部,而无需设置调整大小。但它仍然不居中。有什么想法吗?

1。如果已启用自动布局:
  • 提示:若要使用autolayout将视图居中于另一个视图上,您可以对至少共享一个父视图的任意两个视图使用相同的代码
首先,禁用子视图自动调整大小

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


  • 如果仅使用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);
    })];
    
    目标-C 敏捷的
    您可以这样做,它将始终有效:

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

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

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

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

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

    我将使用:

    child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
    
    self.childView.center = CGPointMake(CGRectGetMidX(self.parentView.bounds),
                                        CGRectGetMidY(self.parentView.bounds));
    
    这是简单的,简短的,甜蜜的。如果您在上面使用@Hejazi的答案,并且
    parent.center
    设置为
    (0,0)
    以外的任何值,则您的子视图将不会居中

    我会使用:

    child.center = CGPointMake(parent.bounds.height / 2, parent.bounds.width / 2)
    
    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);
    
    另一种解决方案是使用
    autoCenterInSuperview

    // ...
    UIView *innerView = [UIView newAutoLayoutView];
    innerView.backgroundColor = [UIColor greenColor];
    [innerView autoSetDimensionsToSize:CGSizeMake(100, 30)];
    
    [outerview addSubview:innerView];
    
    [innerView autoCenterInSuperview];
    
    这就是它的样子:


    在开始之前,让我们提醒一下原点是视图的左上角
    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()
        }
    
    }
    
    这将创建此视图: 黑色矩形的原点和中心与其父矩形的坐标不匹配

    现在,让我们尝试将子视图添加到另一个子视图中,并赋予子视图与子视图相同的原点,但使子视图成为子视图的子视图

    我们将添加以下代码:

    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;
    
    您希望紫色矩形的原点与其父矩形(黑色矩形)相同,但它位于其下方,这是为什么? 因为当你将一个视图添加到另一个视图时,子视图框“world”现在是它的父绑定矩形,如果你有一个视图,它在主屏幕上的原点在坐标(15,15)处,对于它的所有子视图,左上角将是(0,0)

    这就是为什么您需要始终通过父对象的绑定矩形来引用父对象,该矩形是其子视图的“世界”,让我们将这一行修改为:

    subSubView.frame.origin = subView.bounds.origin;
    
    看到神奇之处,子视图现在正好位于其父原点:

    所以,你喜欢“好吧,我只想以我父母的观点为中心,有什么大不了的?” 嗯,这没什么大不了的,你只需要“平移”父中心点,从它的框架到父的边界中心 通过这样做:

    subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
    
    你们实际上是在告诉他“带上家长视图中心,把它转换成子视图世界”

    您将得到以下结果:

    最简单的方法:

    child.center = parent.center
    

    使用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)
    
    并将每个视图的
    translatesAutoResizengMaskintoConstraints
    设置为false

    这将防止崩溃和自动布局的干扰

    您可以使用

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

    yourView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY)
    
    在c#或Xamarin.ios中,我们可以这样使用

    imageView.Center=新的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
    

    您应该使用
    边界
    而不是
    ,因为如果视图具有
    变换
    ,则
    是未定义的。在这种情况下,它实际上不会有什么不同,因为只使用了
    大小
    。这无关紧要,如果视图具有非标识转换的
    转换
    ,则整个
    属性未定义;阅读文章。不幸的是,这个答案实际上是错误的。只需使用Heja的正确答案。@Fattie这里到底出了什么问题?我用它在一个视图中居中一个ImageView,它正在工作。应该注意的是,与公认的答案不同,这个解决方案将在像素边界上清晰对齐,并防止某些宽度的视图模糊。如果我没有弄错的话,child.frame=CGRectIntegral(child.frame);是解决BL描述的问题的一种优雅的“一网打尽”的解决方案。@JoeBlow:谢谢你的提醒。我过去喜欢舍入,但使用块样式时,使用
    CGRectIntegral
    更为优雅。请解释一下设置帧时使用的语法,我以前从未见过。是否始终是分配给属性的“闭包”中的最后一条语句?如果你只使用UIKit级别的自动布局方法:“会导致错误,以后别忘了,child.frame=CGRectIntegral(child.frame);第一:仅当未更改父视图的中心/位置时,此选项才有效。第二:如果使用此方法,则无需转换点(其格式已正确),只需使用
    child.center=parent.center
    。我会使用'child.center=CGPointMake(parent.bounds.height/2,parent.bounds.width/2')。无论父视图中心设置为什么,这都会使子视图居中。如果视图尚未添加到视图层次结构中(例如初始化对象时),这也没有用@Hejazi添加swift answer也很好
    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
    
    childView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
    childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true