限制超视图边界内子视图的移动

限制超视图边界内子视图的移动

本文介绍了限制超视图边界内子视图的移动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个UIView,这是我的VC视图(self.view),我在其中添加了另一个UIView作为子视图,看起来像一个正方形。我想限制superview里面的子视图的移动。基本上子视图不应超出超视范围。

我确实实现了

I have a UIView which is my VC's view(self.view) inside which I have another UIView added as subview both looks like a square. I would like to limit the movement of subview inside the superview. Basically the subview should not go outside the superview bounds.
I did implement

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
// i check if point of touch is inside my superview i set the center i.e
UITouch *touch = [[UITouch allObjects] firstObject];
if (CGRectContainsPoint(subview.frame, [touch locationInView:self.view])) {
// set the center here... i.e
subview.center = [touch locationInView:self.view];
}

此作品和子视图正在移动,但它也移动到超级视图之外;我怎样才能限制超视图中的移动?

This works and subview is moving but it also moves outside the superview; how can I restrict the movement within the superview only?

我甚至尝过类似的东西。

I even tried something like .

if (CGRectContainsRect(self.view.bounds, subview.frame)) {
// this condition works but i don't know why my subview sticks to the sides of superview if i try to drag it through the bounds of superview
}

我不这样做在的touchesBegan,touchesCancelled,并没有任何相关的touchesEnd为好。

I don't do anything in touchesBegan, touchesCancelled, and nothing relevant in touchesEnd as well.

推荐答案

您需要检查要移动的视图的新框架,并将其边缘与其超视图的边界进行比较:

You need to check the "new frame" of the view you are moving, and compare its edges to the bounds of its superview:

@implementation DraggableView

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    // restrict to superview bounds
    CGRect parentFrame = [self.superview bounds];

    UITouch *aTouch = [touches anyObject];
    CGPoint location = [aTouch locationInView:self];
    CGPoint previousLocation = [aTouch previousLocationInView:self];

    // new frame for this "draggable" subview, based on touch offset when moving
    CGRect newFrame = CGRectOffset(self.frame, (location.x - previousLocation.x), (location.y - previousLocation.y));

    if (newFrame.origin.x < 0) {

        // if the new left edge would be outside the superview (dragging left),
        // set the new origin.x to Zero
        newFrame.origin.x = 0;

    } else if (newFrame.origin.x + newFrame.size.width > parentFrame.size.width) {

        // if the right edge would be outside the superview (dragging right),
        // set the new origin.x to the width of the superview - the width of this view
        newFrame.origin.x = parentFrame.size.width - self.frame.size.width;

    }

    if (newFrame.origin.y < 0) {

        // if the new top edge would be outside the superview (dragging up),
        // set the new origin.y to Zero
        newFrame.origin.y = 0;

    } else if (newFrame.origin.y + newFrame.size.height > parentFrame.size.height) {

        // if the new bottom edge would be outside the superview (dragging down),
        // set the new origin.y to the height of the superview - the height of this view
        newFrame.origin.y = parentFrame.size.height - self.frame.size.height;

    }

    // update this view's frame
    self.frame = newFrame;
}

@end

这也使用了触摸,而不是在触摸上居中视图(因此当你开始拖动时它不会跳到你的手指)。

This also uses the offset of the touch, instead of centering the view on the touch (so it doesn't "jump to your finger" when you start dragging).

编辑以便澄清:在此图片中,蓝色视图类为 DraggableView ...无法将其拖出超级视图(红色视图)。

Edit for clarification: In this image, the Blue view class is DraggableView... It cannot be dragged outside of its superView (the Red view).

这篇关于限制超视图边界内子视图的移动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 07:54