ios5uiviewcontentmodeuiview-hierarchy

What type of contents UIViewContentMode mode refers to?


According to the official doc on UIView about the contentMode property:

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

What's defined the content in this definition? Is it a sub view or when we have define a background color for a view for example.

My very first guess was that it should apply at least for the subviews in a view, but for example the following code snippet will not give me the expected result when playing with the UIViewContentModeCenter tag:

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

I have just set up a redView that will include a greenView. I have also set-up the content mode of the redview to UIViewContentModeCenter - why in the code I wrote the greenView is not centered when I change the frame of its parent? isn't what UIViewContentModeCenter is supposed to do?

Thanks for clarifying!

Ps: You can easily test the above code in the loadView of a simple view controller template project.


Solution

  • From the documentation:

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

    For an image view, this is talking about the image. For a view that draws its content, this is talking about the drawn content. It does not affect the layout of subviews.

    You need to look at the autoresizing masks in place on the subviews. Content mode is a red herring here. If you can't achieve the layout you need using autoresizing masks, then you need to implement layoutSubviews and calculate the subview positions and frames manually.

    from jrturton's answer to: https://stackoverflow.com/a/14111480/1374512