用于拖动的子视图约束

Posted

技术标签:

【中文标题】用于拖动的子视图约束【英文标题】:Subview constraints for dragging 【发布时间】:2014-05-18 15:33:11 【问题描述】:

调色板是添加到主故事板的视图。我用圆角半径来做一个圆。调色板内的小圆圈是在调色板视图内创建的子视图。小圆圈是可拖动的。问题是我可以将小圆圈拖到主圆圈(调色板)之外。

如何阻止小圆圈到达主圆圈(调色板)的边界后被拖动。

【问题讨论】:

【参考方案1】:

计算调色板中心点与选取器圆中心点之间的距离 (How to find the distance between two CG points?)

添加选择器圆圈的半径,如果超过较大圆圈的半径,则您要停止拖动。

更新:

因此,如果距离 + R2 >= 半径 1,则您已到达圆的边缘并需要停止拖动

更新2

根据您在此处上传的示例项目是正确的代码...

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 

    for (UITouch *touch in touches)


        CGPoint newPoint = [touch locationInView:self];
        newPoint.x -= startPoint.x;
        newPoint.y -= startPoint.y;
        CGRect frm = [picker frame];
        frm.origin = newPoint;

        CGFloat xDist = abs((newPoint.x + 15) - (self.center.x - self.frame.origin.x));
        CGFloat yDist = abs((newPoint.y + 15) - (self.center.y - self.frame.origin.y));

        CGFloat distance = sqrt((xDist * xDist) + (yDist * yDist));

        if ((distance + 15) >= (self.frame.size.width /2)) 
            // EDGE REACHED SO DON'T UPDATE
         else 
            [picker setFrame:frm];
        

    

如果框架仍在边界内并且您的距离计算没有考虑包含视图的偏移量,您只想更新框架

HTH

【讨论】:

第二部分看不懂 @DivinePropotion 我已经添加了一些更新的内容 我仍然很难做到这一点。您能否查看我的代码并让我知道我做错了什么。此代码放置在paletteView 类中。 paste.ubuntu.com/7494466 @DivinePropotion 快速浏览了几件事,使用视图的center 属性而不是计算它。你说过你的选择器是 30 x 30 那么半径应该是 15 而不是 18.75?调色板半径应为 137.5。还要输入一些NSLog 以查看您的积分是否匹配,例如如果选择器位于调色板的中心,它们的中心点是否相同? pickerVIew 是调色板的子视图吗?您可能需要根据调色板的原点调整选择器中心? 通过调色板的原点调整选择器中心是什么意思?

以上是关于用于拖动的子视图约束的主要内容,如果未能解决你的问题,请参考以下文章

动态调整视图大小(拖动运动)时自动布局约束中断

是否可以通过拖动将一个视图的子视图移动到另一个视图?

如何检测拖动到那里的子视图中的触摸(或获取哪个子视图位于其父视图中的点击下方的最快方法)

使用自动布局约束时,UIView 无法通过 UIpangesture 顺利拖动

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

在 UIScrollView 中拖动一个 UIView