首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UIPinchGestureRecognizer在Xamarin中放大但不缩小

UIPinchGestureRecognizer在Xamarin中放大但不缩小
EN

Stack Overflow用户
提问于 2016-10-04 02:54:54
回答 1查看 571关注 0票数 1

我已经编写了代码,可以让我在iOS中的视图在屏幕上放大,并限制我可以缩小的数量。我不希望用户能够缩小开始屏幕。问题是,下面的代码可以让我放大,但是一旦我在一个点上,我就不能缩小到开始的屏幕。我不确定我做错了什么。

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;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-10-04 21:55:10

我会将这个条件添加到ScaleScreen中的if语句中

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);
         }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39838514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档