Strange behaviour rotating UIImageView inside UIView

寵の児 提交于 2019-12-11 15:34:52

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!