以编程方式集中UIViews

Dav*_*ter 31 iphone user-interface

我已经看到了一些类似的问题,但似乎没有什么是我正在寻找的.如果我错过了在另一个问题中回答的解决方案,请原谅我!

对.我有一个观点.160像素既高又宽.我知道这个视图将被用作子视图,我知道在任何使用它的情况下它总是需要以两个轴为中心.

如果以编程方式定义视图,我怎样才能确保它相对于超视图始终完全居中,水平和垂直?

到目前为止,我只有这个简单的代码:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

这可以实现集中化,但仅限于最简单的情况.非常感谢任何见解.

编辑1:

添加以下代码行:

 self.view.center = self.view.superview.center;
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ong 47

除了@Jasarien和@Brad所说的,不要忘记你可以使用自动调整弹簧和支柱强制自动定心.基本上(在Interface Builder中),您点击四周,直到没有可见的自动调整线,如下所示:

alt text http://gallery.me.com/davedelong/100084/Screen-20shot-202010-03-26-20at-2010-49-18-20AM/web.jpg?ver=12696222220001

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

(UIViewAutoresizingFlexibleLeftMargin   | 
 UIViewAutoresizingFlexibleRightMargin  | 
 UIViewAutoresizingFlexibleTopMargin    | 
 UIViewAutoresizingFlexibleBottomMargin)
Run Code Online (Sandbox Code Playgroud)

如果执行这些操作,则视图会自动保持居中.

编辑#1

回答你的编辑,你做不到:

[.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
Run Code Online (Sandbox Code Playgroud)

除非您的视图已添加为另一个视图的子视图([anotherView addSubview:self.view];).我的猜测是,self.view.superview正在恢复nil,所以你(幸运)得到{0,0}尝试调用时作为返回值centernil.

使视图居中的适当位置可能在viewWillAppear:视图控制器的方法中.一旦视图即将出现,您就知道它必须具有超级视图(否则它将如何出现?).你可以安全地设置你的视图center.


phe*_*cks 41

我想说最简单的方法是将视图的中心设置在它的superview的中心(你可以从superview的高度和宽度属性中获得):

// Init as above and then...
// Get superview's CGSize
CGSize size = self.superview.frame.size;
[self.view setCenter:CGPointMake(size.width/2, size.height/2)];
Run Code Online (Sandbox Code Playgroud)

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

self.view.center = self.view.superview.center;
Run Code Online (Sandbox Code Playgroud)

由于superview的中心在superview的superview中定义.因此,超级视图可以以(0,0)为中心,但您不希望在此时将视图居中.

引用Apple文档:

中心在其超视图的坐标系内指定