问题
A lot of related questions, but I can't see any that quite match this.
My app has a content view and an ad-banner view.
Every time the user rotates the device,
- (void) layoutSubviews
gets called on the content view.
My content view comprises a single image. I want this image to rotate along with the device ( it is a textured background, so I just want to rotate it 90° or 0° depending on whether the physical device is in portrait or landscape.
Here is the code:
//
// ContentView.m
// ChordWheel2
//
// Created by Pi on 16/08/2011.
// Copyright 2011 Pi. All rights reserved.
//
#import "ContentView.h"
#import "Helper.h"
@implementation ContentView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.autoresizesSubviews = YES;
{
// background -- want to cache, so imageNamed is the right method
UIImage* backgroundImage = [UIImage imageNamed: @"background2.png"];
background = [[[UIImageView alloc] initWithFrame: frame] autorelease];
background.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//background.autoresizingMask =
[background setImage: backgroundImage];
[self addSubview: background];
}
}
return self;
}
- (void) layoutSubviews
{
UIDeviceOrientation O = [UIDevice currentDevice].orientation;
BOOL is_L = UIInterfaceOrientationIsLandscape( O );
float theta = is_L ? M_HALF_PI : 0;
LOG( @"T = %@", NSStringFromCGAffineTransform( background.transform ) ) ;
LOG( @"C = %@", NSStringFromCGPoint( background.center ) );
background.transform = CGAffineTransformMakeRotation( theta );
}
@end
Now without the layoutSubviews
override it works. Only it is squashing the image rather than rotating it.
But when I put in the second function it goes haywire.
Here is an output log from repeatedly rotating the device left on the simulator.
T = [1, 0, 0, 1, 0, 0] C = {160, 240}
T = [1, 0, 0, 1, 0, 0] C = {240, 160}
T = [0, 1, -1, 0, 0, 0] C = {160, 240}
T = [1, 0, -0, 1, 0, 0] C = {240, 160}
T = [0, 1, -1, 0, 0, 0] C = {320, 80}
T = [1, 0, -0, 1, 0, 0] C = {400, 0}
T = [0, 1, -1, 0, 0, 0] C = {320, 80}
T = [1, 0, -0, 1, 0, 0] C = {400, 0}
T = [0, 1, -1, 0, 0, 0] C = {320, 80}
T = [1, 0, -0, 1, 0, 0] C = {480, -80}
T = [0, 1, -1, 0, 0, 0] C = {400, 0}
T = [1, 0, -0, 1, 0, 0] C = {640, -80}
T = [0, 1, -1, 0, 0, 0] C = {560, 0}
T = [1, 0, -0, 1, 0, 0] C = {800, -80}
T = [0, 1, -1, 0, 0, 0] C = {720, 0}
T = [1, 0, -0, 1, 0, 0] C = {960, -80}
T = [0, 1, -1, 0, 0, 0] C = {880, 0}
Taking out the transform, it is reporting the center point correctly.
T = [1, 0, 0, 1, 0, 0] C = {160, 240}
T = [1, 0, 0, 1, 0, 0] C = {240, 160}
T = [1, 0, 0, 1, 0, 0] C = {160, 240}
T = [1, 0, 0, 1, 0, 0] C = {240, 160}
T = [1, 0, 0, 1, 0, 0] C = {160, 240}
T = [1, 0, 0, 1, 0, 0] C = {240, 160}
I would like to understand what is going on. Can anyone shed some light?
回答1:
Finally got it.
Firstly I needed to set
self.autoresizesSubviews = NO;
Then I had to re-centre the image view each time the orientation change forces layoutSubviews:
background.center = self.center;
background.transform = CGAffineTransformMakeRotation( theta );
来源:https://stackoverflow.com/questions/7073296/strange-behaviour-rotating-uiimageview-inside-uiview