簡體   English   中英

使用平移/滑動手勢的UIView / Drawer

[英]UIView/Drawer using Pan/Swipe Gesture

我試圖使UIView在Swipe / Pan Gesture上打開和關閉,我從下面的鏈接Link中找到了一些幫助,這與我要制作的內容很接近。

我希望UIView默認以100像素打開,並且用戶可以使用手勢滑動/平移UIView直到父UIViewController 75%並返回100像素,但這在下面的代碼中有所變化。 我希望UIViewX位置為0以便可以像從頂部打開的抽屜一樣。

- (void)viewDidLoad {
    [super viewDidLoad];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
  drawerView = [self.storyboard instantiateViewControllerWithIdentifier:@"drawerVC"];

    [drawerView.view setFrame:CGRectMake(0, -self.view.frame.size.height + 100, self.view.frame.size.width, self.view.frame.size.height * 0.75)];
    [drawerView.view setBackgroundColor:[UIColor redColor]];

    [drawerView.view addGestureRecognizer:panGesture];
}

-(void)move:(UIPanGestureRecognizer*)recognizer {

 recognizer.view.center = CGPointMake(self.view.frame.size.width/2,
                                         recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];




   if (recognizer.state == UIGestureRecognizerStateEnded) {

        CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
        CGFloat slideMult = magnitude / 200;
        NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);

        float slideFactor = 0.1 * slideMult; // Increase for more of a slide
        CGPoint finalPoint = CGPointMake(0,
                                         recognizer.view.center.y + (velocity.y * slideFactor));
        finalPoint.x = 0;
        finalPoint.y = MIN(MAX(finalPoint.y, 0), drawerView.view.frame.size.height*.75);


        if (fabs(recognizer.view.frame.origin.y) >= fabs(yOffset))
        {
            return;
        }
        NSLog(@"ended %f",finalPoint.y);
        if (finalPoint.y < recognizer.view.frame.size.height/2) {
          //  [self movePanelToOriginalPosition];

        }
        else{
            [self movePanelToCenterPosition];
        }


    }
}

-(void)movePanelToCenterPosition {
    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        drawerView.view.frame = CGRectMake(0, 0, drawerView.view.frame.size.width, drawerView.view.frame.size.height);
    }
                     completion:^(BOOL finished) {
                         // Stuff to do
                     }];
}

如果UIView默認(100像素)並且只能向下滑動到所需的CGPoint ,是否有什么可以阻止用戶向頂部(向上)方向平移UIView

在move:方法中,您檢查移動是否開始或正在進行中

else if(recognizer.state == UIGestureRecognizerStateBegin || ognir.state == UIGestureRecognizerStateChanged)“,並且在if視圖處於其極限。

- (void) move:(UIGestureRecognizer *)sender
{
    if(sender.state == UIGestureRecognizerStateBegan || sender.state == UIGestureRecognizerStateChanged)
    {
        BOOL shouldEnablePan = NO; // TODO: do some logic here to figure out if you want to allow pan

        if(!shouldEnablePan && [sender isKindOfClass:[UIPanGestureRecognizer class]])
        {
            sender.enabled = NO;
            sender.enabled = YES;
        }

    } else ...
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM