2014-01-25 127 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; 
     } 
} 

這裏你正在做什麼,你點是否位於視圖的幀。如果是。你正在移動拖動按鈕的中心。讓我知道如果這不能解決你的問題。

更新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

您的手勢框架的限制極限。它只是window.width和height的大小。

下面是手勢教程。我知道它是用於遊戲,但找到你的邏輯到這Tutoril。

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

這會爲你工作。但我在寫斯威夫特

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