2014-01-25 4 views
0

Я создал небольшое тестовое приложение, чтобы применить жест жестка на UIButton. Я успешно применил жест панорамы и смог переместить кнопку. Но проблема в том, что я могу перемещать кнопку даже вне экрана. Как связать его для перемещения только на экране iPhone? Вот мой код:UIButton PanGesture выходит из строя

- (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.

ответ

0

Попробуйте это:

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 с соответствующими ограничениями.

+0

спасибо, я получил намек на это, и я сделал то, что ответил. Спасибо – z22

0

Изменить код так:

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

Вот то, что вы делаете, вы, лежит ли точка в кадре зрения или нет. Если это. вы перемещаете центр перетаскиваемой кнопки. дайте мне знать, если это не решит вашу проблему.

Update 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]; 
    } 

} 
+0

добавил это, все тот же. Кнопка уходит с экрана – z22

+0

@ z22 теперь проверьте это –

+0

@ z22 предложили альтернативное решение –

0

Ограниченный лимит вашей рамы Жест. Это просто размер окна и ширины.

Ниже приведен учебник для жестов. Я знаю, что это для игр, но найти свою логику в этом туториле.

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

Disabling Pan Gesture if out of bounds detected

- (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; 
} 
+0

http://stackoverflow.com/questions/13881006/disabling-pan-gesture-if-out.-of-bounds-detected.here также подсказка –

0

Понял. Кодовый следующим образом:

-(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]; 




} 
2

Это будет работать для вас .. Но я написал в 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) 
} 

Я надеюсь, что это помогает любому, кто искал самый простой способ сделать это.

0
-(void)dragAction:(UIPanGestureRecognizer *)gesture{ 
UIView *vw = (UIView *)gesture.view; 

CGPoint translation = [gesture translationInView:vw]; 
if (CGRectContainsPoint(vw.frame, [gesture locationInView:vw])) { 
    vw.center = CGPointMake(vw.center.x, 
           vw.center.y); 
    [gesture setTranslation:CGPointZero inView:vw]; 
} 
else{ 
    vw.center = CGPointMake(vw.center.x, 
           vw.center.y + translation.y); 
    [gesture setTranslation:CGPointZero inView:vw]; 
} 
Смежные вопросы