UIButton PanGesture излиза от екрана

Създадох малко тестово приложение за прилагане на панорамен жест върху UIButton. Приложих успешно панорамния жест и успях да преместя бутона. Но проблемът е, че мога да преместя бутона дори извън екрана. Как да го обвържа да се движи само в рамките на екрана на iPhone? Ето моят код:

    - (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [panGesture setMinimumNumberOfTouches:1];
    [_shareButton addGestureRecognizer:panGesture];
}

-(IBAction)pan:(UIPanGestureRecognizer *)recognizer
{
    CGPoint trans =[recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x+trans.x, recognizer.view.center.y+trans.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];


}

Как да огранича бутона да излиза извън екрана? Използвам iOS 7, xcode 5.0.


person z22    schedule 25.01.2014    source източник


Отговори (5)


Опитайте тази:

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[pan setDelegate:self];
[shareButton addGestureRecognizer:pan]; 

-(void)handlePan:(UIGestureRecognizer*)panGes{
    CGPoint point = [panGes locationInView:self.view];
    if (point.x >20 && point.x <280 && point.y<400 && point.y>30) {
        CGRect newframe = CGRectMake(point.x, point.y, shareButton.frame.size.width, shareButton.frame.size.height);
        shareButton.frame = newframe;
    }
}

и заменете 20,280 & 400,30 със съответните си лимити.

person Ajay    schedule 25.01.2014
comment
благодаря, получих намек от това и направих това, което отговорих. Благодаря - person z22; 25.01.2014

Това ще ви свърши работа .. Но го написах на Swift:

func callMe(sender: UIPanGestureRecognizer)
{
    let translation = sender.translationInView(self.view)

    let newX = sender.view!.center.x + translation.x
    let newY = sender.view!.center.y + translation.y
    let senderWidth = sender.view!.bounds.width / 2
    let senderHight = sender.view!.bounds.height / 2

    if newX <= senderWidth
    {
        sender.view!.center = CGPoint(x: senderWidth, y: sender.view!.center.y + translation.y)
    }
    else if newX >= self.view.bounds.maxX - senderWidth
    {
        sender.view!.center = CGPoint(x: self.view.bounds.maxX - senderWidth, y: sender.view!.center.y + translation.y)
    }
    if newY <= senderHight
    {
        sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: senderHight)
    }
    else if newY >= self.view.bounds.maxY - senderHight
    {
        sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: self.view.bounds.maxY - senderHight)
    }
    else
    {
        sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y)
    }

    sender.setTranslation(CGPointZero, inView: self.view)
}

Надявам се да помогне на всеки, който търси най-лесния начин да го направи.

person Soufian Hossam    schedule 19.10.2016

Редактирайте кода си така:

-(IBAction)pan:(UIPanGestureRecognizer *)recognizer
{
    CGPoint trans =[recognizer translationInView:self.view];
        if (CGRectContainsPoint([self.view frame], trans)) 
        {
            recognizer.view.center = trans;
        }
}

Тук това, което правите е, вие сте дали точката лежи в рамката на изгледа или не. Ако е. вие местите центъра на плъзнатия бутон.. уведомете ме, ако това не реши проблема ви.

Актуализация 2:

Вместо да прилагате PanGesture, можете също да използвате onDrag събитие:

- (IBAction)onButtonDrag:(id)sender forEvent:(UIEvent *)event {

    CGPoint point = [[[event allTouches] anyObject] locationInView:sender.view];
    UIControl *control = sender;
    if (CGRectContainsPoint([self.view frame], point)) {
        control.center = point;
        [self.view touchesEnded:[event allTouches] withEvent:event];
    }

}
person Prince Agrawal    schedule 25.01.2014
comment
добави това, все същото. Бутонът излиза от екрана - person z22; 25.01.2014
comment
@z22 предложи алтернативно решение - person Prince Agrawal; 25.01.2014

Схванах го. Кодиран както следва:

    -(IBAction)pan:(UIPanGestureRecognizer *)recognizer
{
    CGPoint trans =[recognizer translationInView:self.view];
    CGFloat sumx = _shareButton.frame.origin.x+_shareButton.frame.size.width+5;
        CGFloat sumy = _shareButton.frame.origin.y+_shareButton.frame.size.height+5;

    CGFloat sumxm = _shareButton.frame.origin.x;
    CGFloat sumym = _shareButton.frame.origin.y;

    NSLog(@"position : %f, %f ", _shareButton.frame.origin.x, _shareButton.frame.origin.y);
    NSLog(@"screen : %f, %f ", self.view.frame.size.width ,self.view.frame.size.height);


    if (sumx > self.view.frame.size.width ||  sumy > self.view.frame.size.height )
    {
        CGRect shareButton = _shareButton.frame;
        shareButton.origin.y -= 1;
                shareButton.origin.x -= 1;
        _shareButton.frame = shareButton;

        return;
    }

    else if(sumxm < 0 || sumym < 0) {
        CGRect shareButton = _shareButton.frame;
        if(sumxm < 0)
        {
        shareButton.origin.x =0;
        }
        if(sumym < 0){
        shareButton.origin.y =0;
        }
        _shareButton.frame = shareButton;
        NSLog(@"share button : %f, %f", _shareButton.frame.origin.x, _shareButton.frame.origin.y);
        return;
    }

           recognizer.view.center = CGPointMake(recognizer.view.center.x+trans.x, recognizer.view.center.y+trans.y);

           [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];




}
person z22    schedule 25.01.2014

Обвързана граница на вашата жестова рамка. Това е просто размерът на прозореца. ширина и височина.

По-долу е урок за жестове. Знам, че е за игри, но намерете своята логика в този урок.

http://www.raywenderlich.com/2343/cocos2d-tutorial-for-ios-how-to-drag-and-drop-sprites

Деактивиране на Pan Gesture при установяване на извън границите< /силен>

- (CGPoint)boundLayerPos:(CGPoint)newPos {
    CGSize winSize = [CCDirector sharedDirector].winSize;
    CGPoint retval = newPos;
    retval.x = MIN(retval.x, 0);
    retval.x = MAX(self.position.x); 
    retval.y = self.position.y;
    return retval;
}
person Renish Dadhaniya    schedule 25.01.2014
comment
stackoverflow.com/questions/13881006/ също намек - person Renish Dadhaniya; 25.01.2014