Я видел набор подобных вопросов этому, но ничто, кажется, не полностью, что я ищу. Действительно простите мне, если я пропустил решение, которому отвечают в другом вопросе, хотя!
Правильно. У меня есть представление. 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];
}
Это делает централизацию, но только в самом простом из случаев. Любое понимание значительно ценится.
С добавлением следующей строки кода:
self.view.center = self.view.superview.center;
Центральная точка подпредставления становится (0,0) координата суперпредставления. Возможно, я не настроил суперпредставление правильно?
В дополнение к тому, что сказали @Jasarien и @Brad, не забывайте, что вы можете принудительно выполнить автоматическое центрирование с помощью пружин и распорок с автоподстройкой размеров. По сути (в Interface Builder) вы щелкаете по кругу до тех пор, пока не перестанете отображаться строки автоматического изменения размера, например:
В коде вы устанавливаете - [UIView autoresizingMask]
на:
Цель C:
(UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin)
Swift 3. x:
[.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
Если вы сделаете это, то изображение останется центрированным автоматически.
РЕДАКТИРОВАТЬ №1
Отвечая на ваше редактирование, вы не можете сделать:
self.view.center = self.view.superview.center;
Если ваше представление не было добавлено в качестве подпредставления другого представления ( [anotherView addSubview: self.view];
). Я предполагаю, что self.view.superview
возвращает nil
, и поэтому вы (к счастью) получаете {0,0}
в качестве возвращаемого значения, когда пытается вызвать center
на nil
.
Правильное место для центрирования вашего обзора, вероятно, будет в методе viewWillAppear:
контроллера представления. Когда представление вот-вот появится, вы знаете, что оно должно иметь супервизор (иначе как еще оно могло бы появиться?).Вы можете смело установить здесь центр
вашего представления.
Брэд Смит опередил меня, применив немного более элегантное решение: D
Дайте мне знать, если это не то, что вы ищете for, но пробовали ли вы:
// 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];
Я бы сказал, что самый простой способ сделать это - установить центр представления в центре его супервизора (который можно получить из атрибуты высоты и ширины супервизора):
// 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)];
Я не думаю, что вы можете сделать проще:
self.view.center = self.view.superview.center;
Поскольку центр супервизора определен в супервизоре супервизора. Таким образом, супервизор может быть центрирован вокруг (0,0), но вы не захотите центрировать свое представление в этой точке.
Цитата из документов Apple:
Центр указан в системе координат его супервизора
Предполагая, что вы находитесь внутри подкласса UIView, вы можете сделать это:
-(void) layoutSubviews {
self.center = self.superview.center;
}
Или, если, как указано выше, вы работаете внутри ViewController, вы можете
- (void)loadView {
//...
self.view.center = self.view.superview.center;
}
У меня была такая же проблема. Каждый раз, когда я пытался получить доступ к self.view.superview или self.view.window на viewDidLoad, они возвращали 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.