xcode / iOS: автоматическое изменение размера, чтобы заполнить представление - необходим явный размер кадра? - PullRequest
36 голосов
/ 07 февраля 2011

Я бы хотел, чтобы 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, чтобы он заполнил свой суперпредставление?

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

Ответы [ 2 ]

89 голосов
/ 07 февраля 2011

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

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

textView = [[[UITextView alloc] autorelease] initWithFrame:self.view.bounds];
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
0 голосов
/ 19 апреля 2017

А вот и Свифт 3 Решение:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
...