0

縦向きの 1 つの方向のみをサポートするようにハードコーディングされたアプリケーションがあります。ポートレートはプロジェクト設定で設定します。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{   
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

このビュー コントローラー内には、いくつかのビュー、ボタン、ラベル、およびその他の標準 iOS コントロールがあります。このビュー コントローラー内のすべてのコントロールについて、望ましい動作は、ユーザーが iOS デバイスを回転させたときに、アプリケーション内で何も回転しないことです。

ただし、前述のすべてのビューの下で、「背景」として機能するのは、UIScrollView 内に埋め込まれた UIImageView です。一番下の景色です。ユーザーは、フォト ピッカーを起動するボタンを使用して、いつでもこの背景を変更できます。UIImageView は UIScrollView 内に埋め込まれています。目的の動作は、ピンチ操作で背景画像をズームできるようにするためです。

アプリケーションは回転をサポートしていませんが、ロード時に ImageView のコンテンツが常に正しい向きになるようにしたいと考えています。

たとえば、サポートされている方向は UIInterfaceOrientationPortrait だけであることに注意してください。ユーザーはアプリケーションを起動し、iOS デバイスを LandScape の位置に回転させます。縦長のユーザーが新しい背景画像を選択している間に。意図された動作は、現在の向きに基づいて、選択された画像の向きとアスペクトが正しくなるようにすることです。

基本的に、選択時に常に地球に向かって「重力」を持つ背景画像を探しています。ユーザーが新しい画像を選択した後に iOS デバイスを回転させた場合、背景画像は回転しません。最初に画像を選択したときにのみ、正しい向きになります。

CGAffineTransformMakeRotation を使用して画像を回転させることはできますが、ピンチによるズームインは、画像自体のピクセルが実際には方向を変えないため、望ましくない動作を示します。

ユーザーが画像を選択したときに、実際に新しい画像を作成する必要があるかもしれないと考えています...

UIImage * RightLandscapeImage = [[UIImage alloc] initWithCGImage: userSelectedImage.CGImage
                                                         scale: 1.0
                                                   orientation: UIImageOrientationRight];

この問題の簡単な解決策はありません。おそらく私は簡単なことを見落としていますか?

フォローアップこれは必要と思われるコードです。現在のオリエンテーションとスタートアップのオリエンテーションを考慮します。

UIImage * newImage;
if( startUpOrientation == UIInterfaceOrientationLandscapeRight )
{
    switch (currentOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
          newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                                 scale: 1.0
                                                           orientation: UIImageOrientationDownMirrored];

             [self.backgroundImageView setImage:newImage];
            break;
        case UIInterfaceOrientationLandscapeRight:
             [self.backgroundImageView setImage:bgImage];
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                  scale: 1.0
                                            orientation: UIImageOrientationRight];

            [self.backgroundImageView setImage:newImage];

            break;
        default:
            newImage = [[UIImage alloc] initWithCGImage: bgImage.CGImage
                                                  scale: 1.0
                                            orientation: UIImageOrientationLeft];
            [self.backgroundImageView setImage:newImage];
            break;
    }
 }
4

1 に答える 1

1

willRotateToInterfaceOrientation で回転させたい任意のビューに変換を適用できます

このコードを試すことができます:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
        switch (toInterfaceOrientation) {
            case UIInterfaceOrientationLandscapeLeft:
                yourview.transform = CGAffineTransformMakeRotation(M_PI_2); // 90 degress
                break;
            case UIInterfaceOrientationLandscapeRight:
                yourview.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); // 270 degrees
                break;
            case UIInterfaceOrientationPortraitUpsideDown:
                yourview.transform = CGAffineTransformMakeRotation(M_PI); // 180 degrees
                break;
            default:
                yourview.transform = CGAffineTransformMakeRotation(0.0);
                break;
        }
    }
于 2012-10-25T13:56:38.407 に答える