0

関連する質問がたくさんありますが、これに完全に一致するものはありません。

私のアプリには、コンテンツ ビューと広告バナー ビューがあります。

ユーザーがデバイスを回転させるたびに、

- (void) layoutSubviews

コンテンツ ビューで呼び出されます。

私のコンテンツ ビューは 1 つの画像で構成されています。この画像をデバイスに合わせて回転させたい (テクスチャ背景なので、物理デバイスが縦向きか横向きかに応じて 90° または 0° 回転させたいだけです。

コードは次のとおりです。

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

layoutSubviewsオーバーライドなしで機能するようになりました。画像を回転させるのではなく、押しつぶすだけです。

しかし、2番目の関数を入れると、おかしなことになります。

これは、シミュレーターに残されたデバイスを繰り返し回転させた場合の出力ログです。

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}

変換を取り出して、中心点を正しく報告しています。

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}

何が起こっているのか理解したいです。誰でも光を当てることができますか?

4

1 に答える 1

1

最後にそれを手に入れました。

まず、設定する必要がありました

self.autoresizesSubviews = NO;

次に、方向の変更によってレイアウトサブビューが強制されるたびに、画像ビューを再度中央に配置する必要がありました。

background.center = self.center;
background.transform = CGAffineTransformMakeRotation( theta );
于 2011-08-16T06:15:34.597 に答える