2012-10-10 4 views
8

Nach dem offiziellen doc auf UIView über die contentMode Eigenschaft:Welcher Inhaltstyp bezieht sich auf den UIViewContentMode-Modus?

The content mode specifies how the cached bitmap of the view’s layer is adjusted when the view’s bounds change 

Was den Inhalt in dieser Definition festgelegt ist? Ist es eine Unteransicht oder haben wir beispielsweise eine Hintergrundfarbe für eine Ansicht definiert?

Meine allererste Vermutung war, dass es zumindest für die Subviews in einer Ansicht gelten, aber zum Beispiel der folgende Code-Schnipsel wird mich nicht das erwartete Ergebnis geben, wenn sie mit dem UIViewContentModeCenter Tag spielen:

UIView* redView = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 150, 200)]; 
redView.contentMode = UIViewContentModeCenter; 
redView.backgroundColor = [UIColor redColor]; 

UIView* greenView = [[UIView alloc] initWithFrame:redView.bounds]; 
greenView.backgroundColor = [UIColor greenColor]; 
[redView addSubview:greenView]; 

redView.frame = CGRectInset(redView.frame, -5, -5); 
[self.view addSubview:redView]; 

Ich habe gerade eine redView eingerichtet, die eine greenView enthalten wird. Ich habe auch den Inhalt-Modus der redview auf UIViewContentModeCenter eingerichtet - warum in dem Code, den ich schrieb, ist die greenView nicht zentriert, wenn ich den Rahmen der Eltern ändern? ist nicht was UIViewContentModeCenter soll tun?

Danke für die Klärung!

Ps: Sie können den obigen Code im loadView eines einfachen View-Controller-Vorlagenprojekts leicht testen.

+0

Sicher durch den Rahmen Einstellen Sie die Ansicht neu gezeichnet werden, die die Unteransicht enthält, die an den Rahmen Grenzen gesetzt, die geändert werden? Daher wird es nicht zentriert bleiben, da die Grenzen relativ zu dem Rahmen sind. In einfachem Englisch mit den Grenzen als Rahmen ist Ihr Ursprung immer 0,0 und eine übereinstimmende Breite und Höhe –

Antwort

10

Aus der Dokumentation:

Der Inhalt Modus gibt an, wie die zwischengespeicherte Bitmap der Schicht nach Ansicht eingestellt wird, wenn die Grenzen Änderung der Ansicht.

Bei einer Bildansicht handelt es sich um das Bild. Für eine Ansicht, die seinen Inhalt zeichnet, handelt es sich um den gezeichneten Inhalt. Es wirkt sich nicht auf das Layout von Unteransichten aus.

Sie müssen sich die Autoresizing-Masken in den Unteransichten ansehen. Content-Modus ist hier ein Ablenkungsmanöver. Wenn Sie das Layout nicht erreichen können, müssen Sie Autoresizing-Masken verwenden, dann müssen Sie layoutSubviews implementieren und die Subview-Positionen und Rahmen manuell berechnen.

von jrturton Antwort auf: https://stackoverflow.com/a/14111480/1374512

4

Lesen Sie zuerst über Inhalt Modeshere

In Ihrem Beispiel Sie den Rahmen der roten Ansicht ändern. Dies ruft layoutSubviews in der Ansicht auf, die die grüne Ansicht entsprechend den Layout-Einschränkungen oder Autoresierungsmasken neu positioniert. Sie haben keine angegeben. Der Rahmen der grünen Ansicht bleibt also gleich.

Der Inhaltsmodus gibt an, wie der Layer der Ansicht beim Ändern der Größe aktualisiert werden soll. Abhängig vom Content-Modus wird drawRect aufgerufen oder nicht.

Sie können die Wirkung der verschiedenen Inhaltsarten mit dem folgenden Beispiel testen:

hinzufügen UIView Unterklasse, das zeichnet einen Kreis mit dieser drawRect Umsetzung:

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    NSLog(@"drawRect %@", NSStringFromCGRect(rect)); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextAddEllipseInRect(ctx, self.bounds); 
    [[UIColor redColor] setFill]; 
    CGContextFillPath(ctx); 
} 

Im View-Controller erstellen und fügen Sie den Kreis Ansicht:

CircleView* circleView = [[CircleView alloc] initWithFrame:CGRectMake(10, 10, 20, 20)]; 
circleView.contentMode = UIViewContentModeCenter; // <- try different modes here 
[self.view addSubview:circleView]; 

können Sie nun den Rahmen animieren und sehen, was passiert:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [UIView animateWithDuration:5 animations:^{ 
     circleView.frame = CGRectMake(10, 10, 100, 200); 
    }]; 
}); 

Ich mache das asynchron, um CoreGraphics zu zwingen, die Ansicht mindestens einmal mit dem ursprünglichen Rahmen zu zeichnen. Wenn Sie den Inhaltsmodus nicht einstellen, entsteht ein verschwommener Kreis, da er ohne Neuzeichnen skaliert. UIViewContentModeCenter sorgt dafür, dass der kleine Kreis in der Mitte bleibt - auch kein Neuzeichnen erforderlich. UIViewContentModeRedraw bewirkt, dass die Ansicht die Ansicht erneut mit dem neuen Rahmen zeichnet. Eigentlich passiert das vor Beginn der Animation.

Beachten Sie, dass der Inhaltsmodus die Zeichenleistung beeinträchtigen kann.

Verwandte Themen