【问题标题】:Keep UIView inside Circle Objective-C将 UIView 保持在 Circle Objective-C 中
【发布时间】:2013-10-12 15:31:55
【问题描述】:

如何让我的颜色选择器 (UIView) 留在 300px 300px 的色轮内?我使用UIPanGestureRecognizer 在色轮UIImageView 周围拖动颜色选择器。

色轮直径为300px。

这是我UIViewController的图片:

问题是它可以拖到轮子外的任何地方:

那么我怎样才能让我的UIView 保持在圆圈内的色轮上方?

感谢您的帮助。

【问题讨论】:

  • 你有没有尝试过?你的解决方案做错了什么?
  • 你知道圆的中心和半径。二维中两点之间的(欧几里得)距离是非常基本的数学。还有什么阻碍了你?

标签: iphone ios objective-c uiview cgrect


【解决方案1】:

这看起来更像是一道数学题。如果您只想阻止子视图离开圆圈,那么您需要在执行移动代码的任何位置插入一些逻辑。

首先找到圆的中间。假设圆形视图是一个裁剪的 UIView,通过

CGPoint center;
center.x = view.frame.origin.x + view.frame.size.width/2;
center.y = view.frame.origin.y + view.frame.size.height/2;

然后你必须计算触摸和圆心之间的距离

CGPoint touch = //location of the touch point
CGFloat distance = sqrt( pow(touch.x-center.x,2)+pow(touch.y-center.y,2) )

如果距离小于 300,那么您可以正常移动子视图

if (distance < 300) {
    //do your thing
}

如果您希望视图在您离开圆圈的任何位置停止移动,然后捕捉到您再次进入的任何位置,那么您可以在此处停止。如果你想在手指的方向移动,即使它在视图之外,我建议形成一个向量并将它乘以 300。

CGPoint newPosition;
newPosition.x = touch.x / distance * 300;
newPosition.y = touch.y / distance * 300;

这将为您提供最接近触摸点的圆边缘的位置。

【讨论】:

    【解决方案2】:

    计算距中心的毕达哥拉斯距离,并阻止指示器被拖动到超出所需半径的范围内。您甚至可以预先计算一次半径的平方,并与之进行比较,以避免产生平方根。

    (距离平方 = delta x 平方 + delta y 平方)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      相关资源
      最近更新 更多