【问题标题】:Keep pannable UIView inside bounds将可平移的 UIView 保持在边界内
【发布时间】: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,很酷,我不知道。谢谢。
  • 你可以参考这个答案:stackoverflow.com/a/41179677/6059313

标签: ios geometry


【解决方案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);
    

    现在一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多