2012-02-01 17 views
3

私はUIImageView(StoryBoard上)を追加し、UIScrollViewにUIImageViewを埋め込んだカスタムUIViewControllerを持っています。私のプログラムはイメージをimageViewにロードし、それを適切にフィットするように拡大します。画像のアスペクト比が正確にそうでなければ、スクロールバー オートローテーションでUIScrollViewのzoomScaleプロパティをリセットする

  • 、画像と、視野の、画像が正確に表示に合わせて拡大縮小されることが一致する場合

    • :適切なフィットすることで、私はこのことを意味しますもう一方の次元のスクロールバーを使用して、1つの次元に正確に収まるようにスケーリングされます。

    私は現在viewWillAppearでこれを行います。私はiPhoneを横または縦向きであるかどうか、画像の初期ロードすることを目的として

    -(float) findZoomScale {  
        float widthRatio = self.view.bounds.size.width/self.imageView.image.size.width; 
        float heightRatio = self.view.bounds.size.height/self.imageView.image.size.height; 
        float ratio; 
        if (widthRatio > heightRatio) ratio = widthRatio; 
        else ratio = heightRatio; 
         return ratio; 
    } 
    
    - (void) viewWillAppear:(BOOL)animated { 
        [super viewWillAppear:YES]; 
        self.imageView.image = self.image; 
        self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 
        self.scrollView.contentSize = self.imageView.image.size; 
        self.scrollView.zoomScale = [self findZoomScale]; 
         [self.scrollView flashScrollIndicators]; 
    } 
    
    - (void)viewDidLoad {  
        [super viewDidLoad]; 
        self.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:self.photoURL]]; 
        self.imageView.image = self.image; 
        self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, 
         self.imageView.image.size.height); 
        self.scrollView.delegate = self; 
        self.scrollView.zoomScale = 1.0; 
        self.navigationItem.title = self.photoTitle; 
        self.scrollView.autoresizesSubviews = YES; 
        self.scrollView.autoresizingMask = (UIViewAutoresizingFlexibleBottomMargin | 
         UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | 
         UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | 
         UIViewAutoresizingFlexibleHeight); 
    } 
    

    このコードは動作します。以下はその方法や正しいzoomScaleを計算補助方法のための私のコードです。しかし、すでに読み込まれた画像でiPhoneを回転させると、正しく再スケールされません。 didRotateFromInterfaceOrientationでrescalingを行い、scrollViewのzoomScaleプロパティで再生しようとしましたが、動作させることができません。これは再スケーリングを行う正しい場所ですか?もしそうなら、どうしたらいいですか?ありがとう。

    デュアン

  • 答えて

    16

    私はちょうどこの問題を抱えていました(あなたはCS193pの割り当て4にいると仮定しています)、回転時にUIScrollViewのcontentSizeを調整する前にzoomScaleを1に戻して解決しました。例えば

    :以前のように

    - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
    { 
        //reset zoomScale back to 1 so that contentSize can be modified correctly 
        self.scrollView.zoomScale = 1; 
    
        // reset scrolling area equal to size of image 
        self.scrollView.contentSize = self.imageView.image.size; 
    
        //reset the image frame to the size of the image 
        self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 
    
        //set the zoomScale to what we actually want 
        self.scrollView.zoomScale = [self findZoomScale]; 
    } 
    
    +0

    それは私を助けました。ありがとう:0 –

    0

    があなたのUIViewControllerに

    -(void)viewWillLayoutSubviews 
    

    を使用することができます。ビューがロード/回転/サイズ変更されるたびに呼び出されます。

    +0

    同じ結果。私はそれがどこよりもむしろ再スケーリングしようとしているかもしれないと思う。私はfindZoomScaleメソッドで計算された "比率"を見るためにNSLogsを追加しました。私はポートレートビューで画像をロードして比率を記録し、同じ画像を横長ビューでロードしてから縦長ビューに回転させることができます。両方のポートレートで同じ比率が得られますが、適用されるズームレベルは異なります。私がリセットする必要があるシーンの裏には明らかに何かが起こっています。ローテーションが完了する前または後にトランスフォームに直接何かする必要がありますか? –

    +0

    スクロールビューはViewcontrollersビューのサブビューですか? scrollViewがUIViewControllersのメインビューのサブビューでない場合は、回転通知を受け取ることはありません。また、ScrollViewがビューのサブビューである場合は、自動サイズ変更マスクが正しく設定されていることを確認してください。 – Rich86man

    +0

    はい、スクロールビューはView Controllerのデフォルトビューのサブビューです。マスクの自動サイズ調整に関しては、ストラットとスプリングがそれを処理していた(おそらく間違っている)と考えて、マスクを使用していませんでした。 (私はストーリーボードのすべてのビューを作成しましたが、私は今、私のviewDidLoadメソッドに自動サイズ変更マスクを追加しました、そして私は上記のオリジナルの投稿にそのメソッドを追加しました。何も変わっていません。 –

    関連する問題