Iphone 以编程方式居中UIView

Iphone 以编程方式居中UIView,iphone,user-interface,Iphone,User Interface,我见过很多类似的问题,但似乎没有什么是我所要寻找的。如果我错过了另一个问题的答案,请原谅我 对。我有一个观点。160像素,高宽都有。我知道这个视图将被用作子视图,并且我知道无论在什么情况下,它都需要以两个轴为中心 如果以编程方式定义视图,如何确保它始终相对于其superview在水平和垂直方向上完全居中 到目前为止,我只有以下简单代码: - (void)loadView { self.view = [[UIView alloc] initWithFrame:CGRectMake(80,

我见过很多类似的问题,但似乎没有什么是我所要寻找的。如果我错过了另一个问题的答案,请原谅我

对。我有一个观点。160像素,高宽都有。我知道这个视图将被用作子视图,并且我知道无论在什么情况下,它都需要以两个轴为中心

如果以编程方式定义视图,如何确保它始终相对于其superview在水平和垂直方向上完全居中

到目前为止,我只有以下简单代码:

- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:CGRectMake(80, 150, 160, 160)];
    self.view.backgroundColor = [UIColor greenColor];
    self.view.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin);
    [self.view release];
}
这可以实现集中化,但仅限于最简单的情况。非常感谢您的任何见解

编辑1: 添加以下代码行:

 self.view.center = self.view.superview.center;

子视图的中心点成为超级视图的(0,0)坐标。也许我没有正确设置superview?

假设您在UIView的子类中,您可以执行以下操作:

-(void) layoutSubviews {
  self.center = self.superview.center;
}
或者,如果如上所述,您正在ViewController中工作,您可以

- (void)loadView {
//...
    self.view.center = self.view.superview.center;
}

布拉德·史密斯以一个稍微优雅的解决方案击败了我:D

如果这不是您想要的,请告诉我,但您是否尝试过:

// when adding to a subview, try this, where myView is the view you need centered,
// and myMainView is the view you'll be adding it to as a subview
myView.center = myMainView.center;
[myMainView addSubview:myView];

我认为最简单的方法是将视图的中心设置为其superview的中心(可以从superview的“高度”和“宽度”属性中获得):

我不认为你能做得更简单:

self.view.center = self.view.superview.center;
因为超级视图的中心是在超级视图的超级视图中定义的。因此,superview可以居中于(0,0)附近,但您不希望将视图居中于此点

引用苹果文档:

中心在其superview的坐标系中指定


除了@Jasarien和@Brad所说的,别忘了你可以使用自动调整尺寸的弹簧和支柱强制自动定心。基本上(在Interface Builder中),您可以四处单击,直到看不到自动调整大小的行,如下所示:

在代码中,将
-[UIView autoresizingMask]
设置为:

目标C:

(UIViewAutoresizingFlexibleLeftMargin   | 
 UIViewAutoresizingFlexibleRightMargin  | 
 UIViewAutoresizingFlexibleTopMargin    | 
 UIViewAutoresizingFlexibleBottomMargin)
[.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
Swift 3.x:

(UIViewAutoresizingFlexibleLeftMargin   | 
 UIViewAutoresizingFlexibleRightMargin  | 
 UIViewAutoresizingFlexibleTopMargin    | 
 UIViewAutoresizingFlexibleBottomMargin)
[.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
如果执行这些操作,则视图将自动居中

编辑#1

回答您的编辑,您不能执行以下操作:

self.view.center = self.view.superview.center;
除非您的视图已添加为另一个视图的子视图(
[另一个视图添加子视图:self.view];
)。我的猜测是
self.view.superview
正在返回
nil
,因此(幸运的是)在尝试调用
nil
上的
center
时,您得到了
{0,0}
作为返回值


视图居中的正确位置可能位于视图控制器的
视图将出现:
方法中。一旦视图即将出现,您就知道它必须具有superview(否则它将如何出现?)。您可以安全地将视图的
中心设置在那里。

我也遇到了同样的问题。每次我试图访问viewDidLoad上的self.view.superview或self.view.window时,它们都返回nil。在viewDidLoad中(我想loadView也是如此),这些指针还没有初始化。要解决这个问题,我可以给你一个窍门:

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // both equal to nil
    id lwindow = self.view.window;
    id lparent = self.view.superview;

    [self performSelector:@selector(myViewDidLoad) withObject:nil afterDelay:0.01];
}

- (void)myViewDidLoad
{
    // both not equal to nil!
    id lwindow = self.view.window;
    id lparent = self.view.superview;
} 

就像self.view.parent和self.view.window在viewDidLoad和loadView之后初始化一样。

您的代码会将子视图放置在错误的位置。子视图的中心将位于超级视图的右下角。需要将宽度和高度值除以2才能得到中心。或者您应该只使用
UIView
上的
center
属性。忘记除以2。很好,你必须确保在nib文件中没有选中“使用自动布局”,否则下面的任何解决方案都将不起作用。只有当superview的左上角位于(0,0)时,它才会工作。请参阅下面我的解决方案感谢您的回复。这似乎是正确的,但我在使用这项技术时遇到了另一个问题——也许是Pheelicks在上面描述的问题。我已经用细节编辑了我的原始问题。戴夫,这正是我做错的!傻,傻我,谢谢你给我指点解决办法。在这一点上,我必须给你一个正确的答案,尽管必须说布拉德和菲利克斯的贡献也非常有帮助。再次感谢。否则,我看不出如何将视图中心设置为superview的中心,因为它们位于不同的坐标系中。如果superview的大小为100x100,以其superview内的(900900)为中心,则子视图的中心应为(50,50),而不是(900900)。后者超出了superview的范围!您必须确保在nib文件中未选中“使用自动布局”,否则下面的任何解决方案都将不起作用