2016-10-03 76 views
0

我已經編寫了代碼,可以讓我在iOS中的視圖在屏幕上放大並限制可以縮小的量。我不希望用戶能夠縮小開始屏幕。問題是,下面的代碼會讓我放大,但是一旦我處於某一點,我就無法縮小到開始屏幕。我不知道我做錯了什麼。UIPinchGestureRecognizer在Xamarin中放大,但不放大

float _currentScale = 1.0f; 

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 
    UIPinchGestureRecognizer twoFingerPinch = new UIPinchGestureRecognizer(); 
    twoFingerPinch.Delegate = new GestureDelegate(); 
    View.AddGestureRecognizer(twoFingerPinch); 

} 


class GestureDelegate : UIGestureRecognizerDelegate 
{ 

    public override bool ShouldReceiveTouch(UIGestureRecognizer aRecogniser, UITouch aTouch) 
    { 
     return true; 
    } 

    // Ensure that the pinch, pan and rotate gestures are all recognized simultaneously 
    public override bool ShouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, UIGestureRecognizer otherGestureRecognizer) 
    { 
     // if the gesture recognizers views differ, don't recognize 
     if (gestureRecognizer.View != otherGestureRecognizer.View) 
      return false; 

     // if either of the gesture recognizers is a long press, don't recognize 
     if (gestureRecognizer is UILongPressGestureRecognizer || otherGestureRecognizer is UILongPressGestureRecognizer) 
      return false; 

     return true; 
    } 
} 

void ScaleScreen(UIPinchGestureRecognizer gestureRecognizer) 
{ 
    AdjustAnchorPointForGestureRecognizer(gestureRecognizer); 
    if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed) 
    { 
     float minScale = 1.0f; 
     float maxScale = 3.0f; 
     float zoomSpeed = .5f; 

     float deltaScale = (float)gestureRecognizer.Scale; 

     deltaScale = ((deltaScale - 1) * zoomSpeed) + 1; 

     deltaScale = Math.Min(deltaScale, maxScale/_currentScale); 
     deltaScale = Math.Max(deltaScale, minScale/_currentScale); 
     _currentScale = deltaScale; 


     gestureRecognizer.View.Transform *= CGAffineTransform.MakeScale(deltaScale, deltaScale); 

     // Reset the gesture recognizer's scale - the next callback will get a delta from the current scale. 
     gestureRecognizer.Scale = 1; 
    } 
} 

void AdjustAnchorPointForGestureRecognizer(UIGestureRecognizer gestureRecognizer) 
{ 
    if (gestureRecognizer.State == UIGestureRecognizerState.Began) 
    { 
     var image = gestureRecognizer.View; 
     var locationInView = gestureRecognizer.LocationInView(image); 
     var locationInSuperview = gestureRecognizer.LocationInView(image.Superview); 

     image.Layer.AnchorPoint = new CGPoint(locationInView.X/image.Bounds.Size.Width, locationInView.Y/image.Bounds.Size.Height); 
     image.Center = locationInSuperview; 
    } 
} 

回答

0

我想補充一點情況if語句中ScaleScreen

void ScaleScreen(UIPinchGestureRecognizer gestureRecognizer) 
{ 
    AdjustAnchorPointForGestureRecognizer(gestureRecognizer); 
    if (gestureRecognizer.State == UIGestureRecognizerState.Began ||  gestureRecognizer.State == UIGestureRecognizerState.Changed) 
     //... 
    else { 
     if (gestureRecognizer.View.Transform.xx < 1) 
      UIView.Animate(0.4,() => { 
       gestureRecognizer.View.Transform = CGAffineTransform.MakeIdentity(); 
      }, null); 
     } 
    } 
} 
+0

這是接近我所期待的,但用戶可以縮小過去1只是彈回1時,他們停在你的情況。我現在可能只需要接受它。 – SpaceCowboy74