Программно центрирование UIViews

Я видел набор подобных вопросов этому, но ничто, кажется, не полностью, что я ищу. Действительно простите мне, если я пропустил решение, которому отвечают в другом вопросе, хотя!

Правильно. У меня есть представление. 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];
}

Это делает централизацию, но только в самом простом из случаев. Любое понимание значительно ценится.

РЕДАКТИРОВАНИЕ 1:

С добавлением следующей строки кода:

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

Центральная точка подпредставления становится (0,0) координата суперпредставления. Возможно, я не настроил суперпредставление правильно?

31
задан David Foster 26 March 2010 в 17:41
поделиться

5 ответов

В дополнение к тому, что сказали @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] на:

Цель 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: контроллера представления. Когда представление вот-вот появится, вы знаете, что оно должно иметь супервизор (иначе как еще оно могло бы появиться?).Вы можете смело установить здесь центр вашего представления.

47
ответ дан 27 November 2019 в 21:37
поделиться

Брэд Смит опередил меня, применив немного более элегантное решение: 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];
1
ответ дан 27 November 2019 в 21:37
поделиться

Я бы сказал, что самый простой способ сделать это - установить центр представления в центре его супервизора (который можно получить из атрибуты высоты и ширины супервизора):

// 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:

Центр указан в системе координат его супервизора

41
ответ дан 27 November 2019 в 21:37
поделиться

Предполагая, что вы находитесь внутри подкласса UIView, вы можете сделать это:

-(void) layoutSubviews {
  self.center = self.superview.center;
}

Или, если, как указано выше, вы работаете внутри ViewController, вы можете

- (void)loadView {
//...
    self.view.center = self.view.superview.center;
}
3
ответ дан 27 November 2019 в 21:37
поделиться

У меня была такая же проблема. Каждый раз, когда я пытался получить доступ к 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.

-2
ответ дан 27 November 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: