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