webentwicklung-frage-antwort-db.com.de

xcode/iOS: Automatisch vergrößern, um eine Ansicht zu füllen - eine explizite Bildgröße ist unerlässlich?

Ich möchte, dass eine UITextView ihre superView ausfüllt, die eine einfache UIView innerhalb einer UIViewController-Instanz ist.

Es scheint, dass ich die Variable UITextView nicht allein durch Verwendung der von der API angegebenen Eigenschaften von autoresizingMask und autoresizesSubviews ausführen kann. Wenn Sie diese wie hier gezeigt einstellen, hat dies nichts; Die Variable UITextView bleibt klein, obwohl die Variable superView den Bildschirm ausfüllt.

// 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];

Wenn ich jedoch meine eigene Ansicht im View-Controller instanziiere und die '.view'-Eigenschaft ersetze, funktioniert alles wie erwartet, und die textView füllt ihren Überblick:

// 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];

Ich habe in all diesen Initialisierern/Methoden beide Code-Chunks ausprobiert, und in jedem Fall tritt die gleiche Situation auf:

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

Mir ist klar, dass es sehr schwer ist, die ".view" der UIViewController zu erneuern. Kann jemand erklären, was ich falsch mache? Ich nahm an, dass ich das Problem überwinden könnte, indem ich in meiner UIViewController einen anfänglichen Frame-Einstellcode einmal zur Größenänderung der UITextView habe und danach autoresizing wie gewünscht arbeiten würde.

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

... aber scheinbar ist das view.frame zu diesem Zeitpunkt noch nicht eingerichtet, es wurden keine '.size'-Werte definiert, so dass textView wieder klein bleibt.

Was ist der richtige Weg, um das zu erreichen, was ich will? Muss ich die Vollbildmaße explizit über UITextView:initWithFrame angeben, damit der Superview ausgefüllt wird?

Für Hinweise, die Sie mir geben können, wäre ich Ihnen dankbar.

36
KomodoDave

Autoresizing bedeutet nicht, dass die Unteransicht die Größe der Supervision einnimmt. Dies bedeutet lediglich, dass die Größe des Superviews immer dann geändert wird, wenn sich die Grenzen des Superview ändern. Sie müssen also zunächst die Größe der Unteransicht auf den korrekten Wert einstellen. Die autoresizing Maske behandelt dann die Größenänderungen in der Zukunft.

Das ist alles was du brauchst:

textView = [[[UITextView alloc] autorelease] initWithFrame:self.view.bounds];
[textView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|
                              UIViewAutoresizingFlexibleHeight];
89
Ole Begemann

Und hier Swift 3 Lösung:

myView.autoresizingMask = [.flexibleWidth, .flexibleHeight]