2013-04-10 11 views
6

私はのカスタムを作成するプロジェクトにいます。UIImagePickerController (コントローラーがimagePickerController.allowsEditing=YESの場合に表示されます)scrollViewDidZoomでcontentInsetを動的に調整するにはどうすればよいですか?私はUIScrollviewのUIImageViewのcontentInsetを最初に設定しました

crop an UIImage下の図のような切り口の中に入れたいと思います。

screenshot 1

そして私はcontentInsetを設定するためのいくつかのコードを作りました。

self.selectedImageView.backgroundColor = [UIColor redColor]; 

    CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
    CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
    CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 
    self.contentInset = UIEdgeInsetsMake(difference/2, 0, difference/2 + 20, 0); // 20 is status bar height 

となります。

screenshot 2

黒い領域がcontentInsetエリアです。

しかし、このscrollViewをつまんでズームインすると、何かが起こります。

screenshot 3

私は動的にcontentInsetを調整する

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

に何かをしなければならないと思います。これどうやってするの?私に助けてください:)

+1

そうでもないあなたの質問への答えが、あなたのアプローチは、Appleのとは異なり、それが問題です。画像が完全にズームアウトされたときにスクロールすることを許可していない場合、ピンチジェスチャーを使用しているときに画像の上部をズームインするだけではなりません。アップルが使用するアプローチを変更し、ズームの領域を制限するか、プログラムでズームを実行するためにいくつかのUI要素を使用する必要があります。ズームする領域を完全に制御できます。 – Eugene

+0

@Eugeneご意見ありがとうございます。私のアプローチはAppleと全く同じだと思う。私は、デフォルトのUIImagePickerControllerを模倣します。私は、デフォルトのUIImagePickerController 'Move and Scale' Controllerを実装したいだけです。なぜこれがAppleのより洗練されたものと異なるのか説明してください。 –

答えて

3

誰かがこの質問に答えることを望みましたが、私は悲しいです。

しかし、神に感謝し、私はこれを解決しました。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

で動的にzoomScaleを用いcontentInsetを調整します。私はちょうどテストのためにLanscape modeを実装しますが、Portrait modeはまったく同じ方法です。

// adjust contentInset 
CGFloat increasingZoomScale = (scrollView.zoomScale == 1) ? 0 : (-1 * (1 - scrollView.zoomScale)); 

CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 

// implement at `Landscape` mode first 
if (self.photoCropOrientation == SKPhotoCropOrientationPortrait) { 

}else{ 
    // get scaledFrameHeight because it's `Landscape` crop mode 
    CGFloat increasingFrameHeight = scrollView.frame.size.height * increasingZoomScale; 
    self.contentInset = UIEdgeInsetsMake(difference/2 - increasingFrameHeight/2, 0, difference/2 - increasingFrameHeight/2, 0); 
} 

とbam。ここにスクリーンショットがあります。

screenshot 4

関連する問題