将可缩放的UIView保持在范围内

时间:2018-07-17 08:47:33

标签: ios geometry

我正在开发一个iOS应用程序,其中包含可缩放且可缩放的UIView。由于允许用户平移和缩放视图,因此我想将UIView保留在屏幕的边界内。

我在互联网上进行了很多搜索,但似乎没有真正符合我需要的示例。

下面是我编写的平移代码:

private void HandlePan(UIPanGestureRecognizer recognizer)
{
    if (recognizer.State != UIGestureRecognizerState.Began &&
        recognizer.State != UIGestureRecognizerState.Changed)
        return;

    var translation = recognizer.TranslationInView(this);

    _posX += translation.X;
    _posY += translation.Y;

    var maxX = (Bounds.Size.Width / 2) * _currentScale;
    var maxY = (Bounds.Size.Height / 2) * _currentScale;

    // TODO: The min values are wrong
    var minX = (Bounds.Size.Width / 2) / _currentScale;
    var minY = (Bounds.Size.Height / 2) / _currentScale;

    if (_posX > maxX)
        _posX = maxX;
    else if (_posX < minX)
        _posX = minX;
    if (_posY > maxY)
        _posY = maxY;
    else if (_posY < minY)
        _posY = minY;

    var translatedCenter = new CGPoint(_posX, _posY);
    Center = translatedCenter;

    recognizer.SetTranslation(CGPoint.Empty, this);
}

我设法使边界仅在屏幕的两侧起作用。 maxXmaxY是正确的。我只是不知道如何计算正确的minXminY值的方法。

下面,我添加了一个屏幕录像,以显示问题所在:

Screen recording

当我尝试拖动到图像的右侧/底部(分别为minX和{{1})时,可以看到坐标正在阻塞(当比例递增> 1时,坐标甚至更多) }值。

此计算中有什么问题或正确的计算应该是什么?请注意,minYmaxX可以正常工作。

maxY

2 个答案:

答案 0 :(得分:1)

计算边界的另一种方法也可以是:

int centerPoint = (int)(Bounds.Size.Width / 2);

var minX = centerPoint - ((_currentScale - 1) * centerPoint);
if (_posX < minX)
    _posX = minX;

答案 1 :(得分:0)

经过反复试验,我设法通过将图像手动移动到框架的边框并记下所有值来对其进行修复。

值看起来像这样:

Bounds = 375
maxX = 187.5, minX = 187.5, scale = 1
maxX = 549.039223765595, minX = -173.989914508274, scale = 2.92820919341651
maxX = 915.278849493097, minX = -539.668274239639, scale = 4.88052876267261
maxX = 1575.12891219963, minX = -1198.9316584188, scale = 8.40338022601214

这意味着以下公式能够获得min值。

var minX = -(maxX - Bounds.Size.Width);
var minY = -(maxY - Bounds.Size.Height);

现在一切正常。