3

uiscrollview 内に配置されている uiimageview のスケーリングに問題があります。StackOverflow でも、私の問題に関連するすべての質問をグーグルで調べて確認しました。StackOverflow に投稿されているすべての回答も試しました。何もうまくいきませんでした。

まず、uiimageview を nib ファイルの uiscrollview 内に配置し、カメラ ロールから画像を取得して画像ビューを塗りつぶします。次に、uirotationgesturerecognizer を使用して画像を回転させています。

これが私がやろうとしているコードです。

- (void)viewDidLoad
{
 [super viewDidLoad];
 NSLog(@"%@",[[UIDevice currentDevice] model]);

// Do any additional setup after loading the view, typically from a nib.
 self.imagePicker = [[[UIImagePickerController alloc] init] autorelease];

 self.picChosenImageView.layer.shouldRasterize = YES;
 self.picChosenImageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

 self.picChosenImageView.layer.contents = (id)[UIImage imageNamed:@"test"].CGImage;
 self.picChosenImageView.layer.shadowColor = [UIColor blackColor].CGColor;
 self.picChosenImageView.layer.shadowOpacity = 0.8f;
 self.picChosenImageView.layer.shadowRadius = 8;
 self.picChosenImageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.picChosenImageView.bounds].CGPath;

 UIRotationGestureRecognizer *rotationRecognizer = [[[UIRotationGestureRecognizer alloc]initWithTarget:self
                                                                                               action:@selector(handleRotate:)] autorelease];
 rotationRecognizer.delegate = self;
 [self.picChosenImageView addGestureRecognizer:rotationRecognizer];

 self.containerView.delegate = self;
 self.containerView.contentSize = self.picChosenImageView.layer.frame.size;
 self.containerView.maximumZoomScale = 4.0f;
 self.containerView.minimumZoomScale = 1.0f;
 angle = 0.0f;
 useRotation = 0.0;
 isRotationStarted=FALSE;
 isZoomingStarted = FALSE; 
}

-(void)lockZoom
{
 maximumZoomScale = self.containerView.maximumZoomScale;
 minimumZoomScale = self.containerView.minimumZoomScale;

 self.containerView.maximumZoomScale = 1.0;
 self.containerView.minimumZoomScale = 1.0;
 self.containerView.clipsToBounds = false;
 self.containerView.scrollEnabled = false;
}

-(void)unlockZoom
{
    self.containerView.maximumZoomScale = maximumZoomScale;
    self.containerView.minimumZoomScale = minimumZoomScale;
    self.containerView.clipsToBounds = true;
    self.containerView.scrollEnabled = true;
}

#pragma mark - ScrollView delegate methods

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return  self.picChosenImageView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{

    CGRect frame = self.picChosenImageView.frame;
    frame.origin = CGPointZero;
    self.picChosenImageView.frame = frame;
    //self.picChosenImageView.transform = prevTransform;

}

-(void) scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
    if(!isZoomingStarted)
    {
        self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle);
        NSLog(@"The zooming started");
        isZoomingStarted = TRUE;
        CGSize contentSize = self.containerView.bounds.size;
        CGRect contentFrame = self.containerView.bounds;
        NSLog(@"frame on start: %@", NSStringFromCGRect(contentFrame));
        NSLog(@"size on start: %@", NSStringFromCGSize(contentSize));
        //prevTransform = self.picChosenImageView.transform;
    }
}

-(void) scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    if(isZoomingStarted)
    {
        self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle);
        isZoomingStarted = FALSE;
        CGSize contentSize = self.containerView.contentSize;
        CGRect contentFrame = self.containerView.bounds;
        NSLog(@"frame on end: %@", NSStringFromCGRect(contentFrame));
        NSLog(@"size on end: %@", NSStringFromCGSize(contentSize));
    }
}

#pragma mark - GestureRecognizer methods

- (void) handleRotate:(UIRotationGestureRecognizer *)recognizer
{
    if(isZoomingStarted == FALSE)
    {
        if([recognizer state] == UIGestureRecognizerStateBegan)
        {
            angle = 0.0f;
            [self lockZoom];
        }

        useRotation+= recognizer.rotation;

        while( useRotation < -M_PI )
        {
            useRotation += M_PI*2;
        }
        while( useRotation > M_PI )
        {
            useRotation -= M_PI*2;
        }
        NSLog(@"The rotated value is %f",RADIANS_TO_DEGREES(useRotation));
        self.picChosenImageView.transform = CGAffineTransformRotate([self.picChosenImageView transform],
                                                                    recognizer.rotation);
        [recognizer setRotation:0];

        if([recognizer state] == UIGestureRecognizerStateEnded)
        {
            angle = useRotation;
            useRotation = 0.0f;
            isRotationStarted = FALSE;
            self.containerView.hidden = NO;
            //prevTransform = self.picChosenImageView.transform;
            [self unlockZoom];
        }
    }
}

私の問題は、ズームインとズームアウトを正常に実行できることです。必要に応じて uiimageview を回転できます。uiimageview を特定の角度に回転させた後、ズームインしようとすると、imageview が元の位置に戻り (0 度に回転して)、ズームが行われます。回転とズームを保持したい。以前の変換を保存して、back scrollDidzoom および scrollDidBegin デリゲート メソッドに割り当ててみました。どれも機能しませんでした。私が見落としている間違いを見つけるのを手伝ってください。

4

2 に答える 2

0

私も同じ問題を抱えていました。UIScrollView は UIImageView を制御し、回転なしで変換を使用しています。

そのため、スクロールに画像参照を与えず、スケーリングのために UIPinchGestureRecognizer を追加しました。

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
  return nil
}

ドラッグはまだ機能しています:)

// viewDidLoad
var pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecogniezed))
scrollView.addGestureRecognizer(pinchGestureRecognizer)


func pinchRecogniezed(sender: UIPinchGestureRecognizer) {
    if sender.state == .Began || sender.state == .Changed {
        let scale = sender.scale
        imageView.transform = CGAffineTransformScale(imageView.transform, scale, scale)
        sender.scale = 1
    }
}
于 2016-06-06T14:32:06.137 に答える
0

CGAffineTransformScaleズームのためにフレームのサイズを変更するだけでなく、使用してみてください。

anImage.transform = CGAffineTransformScale(anImage.transform, 2.0, 2.0);

スケーリングの変換を変更すると、回転の問題が解決する場合があります。

お役に立てれば。

于 2012-08-09T17:06:01.110 に答える