将可平移的 UIView 保持在边界内

Posted

技术标签:

【中文标题】将可平移的 UIView 保持在边界内【英文标题】:Keep pannable UIView inside bounds 【发布时间】:2018-07-17 08:47:33 【问题描述】:

我正在开发一个 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 值。

下面我添加了一个屏幕录像来显示出了什么问题:

当我尝试拖动到图像的右侧/底部(即minXminY 值)时,您可以看到坐标被阻塞(当比例增加> 1 时更是如此)。

这个计算有什么问题或者正确的计算应该是什么?请注意,maxXmaxY 工作正常。

var minX = (Bounds.Size.Width / 2) / _currentScale;
var minY = (Bounds.Size.Height / 2) / _currentScale;

【问题讨论】:

如果你只是想放大/缩小一个 UIImageView,那么你应该使用 ScrollView 的内置方法。 @SharadChauhan,很酷,我不知道。谢谢。 你可以参考这个答案:***.com/a/41179677/6059313 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

经过大量试验和错误后,我设法通过手动将图像移动到框架的边界并写下所有值来修复它。

值如下所示:

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);

现在一切正常。

【讨论】:

以上是关于将可平移的 UIView 保持在边界内的主要内容,如果未能解决你的问题,请参考以下文章

确保可拖动的图像视图保持在框架的边界内

使用平移手势在屏幕的有限区域中移动 UIView

在 UIView 内缩放图像而不改变边界?

UIScrollView 缩放:将平移限制为 imageView.image 边界

设置平移手势的界限

UIScrollView 子视图在缩放下不保持正确的边界尺寸