Segev
Segev

Reputation: 19303

Why a subView won't stay in the parent frame?

I have a view and inside it there's a UIImage. The image isn't static and I can move it around if I drag my finger around (using drag events) The problem is that sometimes the picture moves outside of the UIView frame. What's the appropriate way to keep it inside the parent frame bounds?

--UIViewA

--------UIViewB

--------------UIImage

--------------UIButton

I want to keep UIImage inside UIViewB

- (IBAction)myButtonSingleTap:(UIButton *)sender {
    imDragging = YES;
    [_myButton addTarget:self action:@selector(dragBegan:withEvent:) forControlEvents: UIControlEventTouchDown];

}

- (IBAction)myButtonDragInside:(UIButton *)sender
{
    [_myButton addTarget:self action:@selector(draging:withEvent:) forControlEvents: UIControlEventTouchDragInside];

}
- (void)dragBegan:(UIControl *)c withEvent:ev {

    UITouch *touch = [[ev allTouches] anyObject];
    startingTouchPoint = [touch locationInView:self.view];

}
- (void)draging:(UIControl *)c withEvent:ev {
    UITouch *touch = [[ev allTouches] anyObject];
    currentTouchPoint = [touch locationInView:self.view];
    _movingPic.frame = CGRectMake(currentTouchPoint.x, currentTouchPoint.y, 28, 23);
}

Upvotes: 0

Views: 385

Answers (3)

Christian Schnorr
Christian Schnorr

Reputation: 10786

Before setting the new frame, make sure it is contained by the moving view's superview's bounds.

- (void)draging:(UIControl *)c withEvent:ev
{
    UITouch *touch = [[ev allTouches] anyObject];
    currentTouchPoint = [touch locationInView:self.view];
    CGRect newFrame = CGRectMake(currentTouchPoint.x, currentTouchPoint.y, 28, 23);
    newFrame.x = MAX(newFrame.x, 0);
    newFrame.y = MAX(newFrame.y, 0);
    newFrame.x = MIN(newFrame.x, _movingPic.superview.bounds.size.width - 28);
    newFrame.y = MIN(newFrame.y, _movingPic.superview.bounds.size.height - 23);
    _movingPic.frame = newFrame;
}

Upvotes: 0

Fogmeister
Fogmeister

Reputation: 77651

You will need to check the location of the view during the dragging.

At some point you will be setting the frame of the image depending on the user's drag direction, etc...

During this you should have a logic check like...

If new location x value is less than 0 then set new location x = 0.
If new location x value plus image width is greater than view width then set new location x = view width - image width.

etc...

Then use the new location as the point to move the image to.

Upvotes: 1

Mohith
Mohith

Reputation: 96

Try adding the touch recogniser to the parent view and not the entire view

Upvotes: 0

Related Questions