1

CGAffineTransformMakeRotationを使用してビューを回転しました。(iPhone-1つのビューコントローラで横向きを許可します

以下に示すように、画像の左右に白い領域があります。
画像が黒の背景でスペース全体を占めるようにしたい(少なくとも1つの次元、幅、または高さで)

ここに画像の説明を入力してください

以下は完全なコードです

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.view.backgroundColor = [UIColor blackColor];

    self.imageView.backgroundColor = [UIColor blackColor];
    self.imageView.opaque = NO;
    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth |
        UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;

    [self.imageView setImageWithURL:[NSURL URLWithString:self.jsonAlbumImage.url_image
                                           relativeToURL: [NSURL URLWithString:@URL_BASE]]
                   placeholderImage: [GlobalHelper placeHolderImage]];

    [self.view addSubview: self.imageView];

}

- (void)didRotate:(NSNotification *)notification {
    UIDeviceOrientation orientation = [[notification object] orientation];

    if (orientation == UIDeviceOrientationLandscapeLeft) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI / 2.0)];
    } else if (orientation == UIDeviceOrientationLandscapeRight) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI / -2.0)];
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        [self.view setTransform:CGAffineTransformMakeRotation(M_PI)];
    } else if (orientation == UIDeviceOrientationPortrait) {
        [self.view setTransform:CGAffineTransformMakeRotation(0.0)];
    }
}

- 編集 -

最終的に私のために働いたのは..なぜ変更が機能するのかわからない..どんな説明も素晴らしいでしょう!

  UIDeviceOrientation orientation = [[notification object] orientation];

    CGAffineTransform t;
    CGRect rect;
    if (orientation == UIDeviceOrientationLandscapeLeft) {
        t = CGAffineTransformMakeRotation(M_PI / 2.0);
        rect = CGRectMake(0,0,480,320);
    } else if (orientation == UIDeviceOrientationLandscapeRight) {
        t = CGAffineTransformMakeRotation(M_PI / -2.0);
        rect = CGRectMake(0,0,480,320);
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
        t = CGAffineTransformMakeRotation(M_PI);
        rect = CGRectMake(0,0,320,480);
    } else if (orientation == UIDeviceOrientationPortrait) {
        t = CGAffineTransformMakeRotation(0.0);
        rect = CGRectMake(0,0,320,480);
    }
    else
        return; // looks like there are other orientations than the specified 4

    [self.view setTransform:t];
    self.view.bounds = rect;
4

1 に答える 1

1

では- (void)didRotate:(NSNotification *)notification、ビューが使用可能なすべてのスペースを占めるように、ビューをリレーアウトする必要があります。あなたはこのようなことをすることができます:

- (void)didRotate:(NSNotification *)notification {
  UIDeviceOrientation orientation = [[notification object] orientation];

  CGAffineTransform t;
  if (orientation == UIDeviceOrientationLandscapeLeft) {
    t = CGAffineTransformMakeRotation(M_PI / 2.0);
  } else if (orientation == UIDeviceOrientationLandscapeRight) {
    t = CGAffineTransformMakeRotation(M_PI / -2.0);
  } else if (orientation == UIDeviceOrientationPortraitUpsideDown) {
    t = CGAffineTransformMakeRotation(M_PI);
  } else if (orientation == UIDeviceOrientationPortrait) {
    t = CGAffineTransformMakeRotation(0.0);
  }

  CGPoint screenCenter = CGPointMake([UIScreen mainScreen].bounds.width/2,[UIScreen mainScreen].bounds.height/2);
  self.view.center = CGPointApplyAffineTransform(screenCenter, t);
  self.view.bounds = CGRectApplyAffineTransform([UIScreen mainScreen].bounds, t);
  [self.view setTransform:t];

}

どこ :

CGRectApplyAffineTransform

アフィン変換を長方形に適用します。

       CGRect CGRectApplyAffineTransform (
           CGRect rect,
           CGAffineTransform t
         );

この行も削除してみてください:

self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

自動回転を使用しない場合は必要ありません。ビューのフレームの設定と競合する可能性があります。これは、ビューのフレームの変更が表示されていないという事実を説明するための単なる仮説です。

編集:

この変換が何をするのか知りたいです

さて、変換は回転を行っています。

回転は、ピボットとして使用されるアンカーポイントを基準にしています。何が起こるかというと、アンカーポイントが回転しているビューの中央にない場合、ビューも移動されます(頂点の周りの回転を想像してください)。

したがって、物事を均一にするために境界を設定するのは正しいことです。確かに私は次の行でそれを提案していました:

  self.view.center = CGPointApplyAffineTransform(screenCenter, t);
  self.view.bounds = CGRectApplyAffineTransform([UIScreen mainScreen].bounds, t);

しかし、おそらく中心と境界の両方に同じ変換を適用するというアイデアは祝福されていませんでした。(それはまた、何が起こっているのかを見るために、私がいくつかの痕跡を求めた理由です:-)

于 2013-01-15T09:01:37.297 に答える