将可平移的 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);
我设法使边界仅在屏幕的两侧起作用。 maxX
和 maxY
是正确的。我只是不知道如何计算正确的minX
和minY
值。
下面我添加了一个屏幕录像来显示出了什么问题:
当我尝试拖动到图像的右侧/底部(即minX
和minY
值)时,您可以看到坐标被阻塞(当比例增加> 1 时更是如此)。
这个计算有什么问题或者正确的计算应该是什么?请注意,maxX
和 maxY
工作正常。
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 保持在边界内的主要内容,如果未能解决你的问题,请参考以下文章