拖放UIButton但限制为边界

时间:2011-08-04 19:22:32

标签: objective-c drag-and-drop uibutton draggable

我不是要求给出一些代号,只是在正确的方向上轻推一下会非常感激。我的搜索没有任何好处。

我有一个UIButton,我可以在屏幕上自由移动。

我想限制此对象上的拖动区域,以便它只能上下移动或左右移动。我相信我需要获得边界的x,y坐标,然后限制在该区域之外的移动。但这是我所拥有的。我的知识不会比这更进一步。

过去有没有人实现类似的东西?

亚当

2 个答案:

答案 0 :(得分:4)

因此,假设您处于拖动操作的中间位置。您通过将其中心设置为导致移动的任何手势的中心来移动按钮实例。

您可以通过测试手势的中心来强加限制,如果不喜欢,可以重置中心值。下面假设一个按钮连接到所有Touch Drag事件的动作,但如果您使用手势识别器或touchesBegan:和朋友,原则仍然适用。

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];

    if (point.y > 200)
    {
        point.y = 200; //No dragging this button lower than 200px from the origin!
    }

    sender.center = point;
}

如果你想要一个只在一个轴上滑动的按钮,这很容易:

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];  
    point.y = sender.center.y; //Always stick to the same y value

    sender.center = point;
}

或许您希望该按钮仅在特定视图的区域内可拖动。如果边界复杂,这可能更容易定义。

- (IBAction)handleDrag:(UIButton *)sender forEvent:(UIEvent *)event 
{   
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.someView];

    if ([self.someView pointInside:point withEvent:nil])
    {
        sender.center = point; 
        //Only if the gesture center is inside the specified view will the button be moved
    }
}

答案 1 :(得分:1)

大概你正在使用touchesBegan:touchesMoved:等,所以它应该像测试触点是否在touchesMoved:中的视图范围之外一样简单。如果它在外面,请忽略它,但如果它在里面,请调整按钮的位置。

我怀疑你可能会觉得这个功能很有用:

bool CGRectContainsPoint ( CGRect rect, CGPoint point );