Я написал код, который позволит моему представлению в 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;
}
}
Это близко к тому, что я ищу, но пользователь может увеличить мимо 1. он просто отскакивает назад на 1, когда они остановитесь в своем случае. На этот раз я могу просто принять его. – SpaceCowboy74