xcode/iOS: автоматическое изменение размера для заполнения представления - необходим явный размер кадра?

Я хотел бы, чтобы UITextView заполнил свой superView, который является простым UIView внутри экземпляра UIViewController.

Кажется, я не могу заставить UITextView делать это исключительно с помощью определенных API-свойств autoresizingMask и autoresizesSubviews. Установка их, как показано здесь, ничего не делает; UITextView остается маленьким, хотя его superView заполняет весь экран.

// use existing instantiated view inside view controller;
// ensure autosizing enabled
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight|
                             UIViewAutoresizingFlexibleWidth;
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

Однако, если я создам собственное представление внутри контроллера представления, заменив его свойство '.view', тогда все будет работать, как и ожидалось, и textView заполнит свое суперпредставление:

// reinstantiate view inside view controller
self.view = [[UIView alloc]init];
// create textview
textView = [[[UITextView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 1, 1)];
// enable textview autoresizing
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
// add textview to view
[self.view addSubview:textView];

Я пробовал оба фрагмента кода внутри всех этих инициализаторов/методов, и в каждом случае возникает одна и та же ситуация:

-(id)init;
-(id)initWithFrame:(CGRect)frame;
-(void)viewDidLoad;

Я понимаю, что воссоздание '.view' UIViewController некрасиво, может ли кто-нибудь объяснить, что я делаю неправильно? Я предположил, что смогу решить эту проблему, если в моем UIViewController будет исходный код настройки кадра, чтобы изменить размер UITextView один раз, и после этого autoresizing будет работать как нужно.

-(void)viewDidLoad {
    textView.frame = self.view.frame;
}

... но, похоже, view.frame не настроен на этом этапе, для него не определены значения '.size', поэтому textView снова остается маленьким.

Каков правильный способ достижения того, что я хочу? Должен ли я явно указывать полноэкранные размеры через UITextView:initWithFrame, чтобы он заполнил свой супервизор?

Буду признателен за любой совет, который вы можете предложить.


person KomodoDave    schedule 07.02.2011    source источник
comment
Не делайте autorelease до init. Правильный порядок: `... alloc] init] autorelease]. UIView` должен быть в порядке, но NSStrings и другие кластеры классов будут просачиваться, если вы используете autorelease и init в неправильном порядке. Извините, что не смог помочь вашему реальному вопросу.   -  person Yuji    schedule 07.02.2011
comment
Спасибо Юдзи, я ценю совет - я не знал!   -  person KomodoDave    schedule 08.02.2011


Ответы (2)


Автоматическое изменение размера не означает, что подпредставление будет занимать размер своего суперпредставления. Это просто означает, что он будет изменять размер относительно изменения размера своего супервизора всякий раз, когда изменяются границы супервизора. Итак, изначально вы должны установить правильное значение размера подпредставления. Маска автоматического изменения размера затем будет иметь дело с изменениями размера в будущем.

Это все, что вам нужно:

textView = [[[UITextView alloc] autorelease] initWithFrame:self.view.bounds];
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
person Ole Begemann    schedule 07.02.2011
comment
Я поместил это в loadView (убедившись, что сначала вызвал [super loadView]), и он отлично справляется со своей задачей :) Большое спасибо, Оле. - person KomodoDave; 08.02.2011
comment
Для Swift это выглядит так: var textView = UITextView(frame: self.view.bounds) textView.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight - person martinmose; 16.09.2015
comment
Для Swift 2 возьмите это: textView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight] - person Peter Kreinz; 11.11.2015

А вот решение Swift 3:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
person Philippe H. Regenass    schedule 19.04.2017