UIView appereance from bottom to top and vice versa(Core Animation)

前端 未结 4 1243
予麋鹿
予麋鹿 2021-02-02 12:24

My goal is to understand and implement feature via Core Animation.
I think it\'s not so hard,but unfortunately i don\'t know swift/Obj C and it\'s hard to understand native

相关标签:
4条回答
  • 2021-02-02 13:08

    You can use like this Extension

    extension UIView{
        func animShow(){
            UIView.animate(withDuration: 2, delay: 0, options: [.curveEaseIn],
                           animations: {
                            self.center.y -= self.bounds.height
                            self.layoutIfNeeded()
            }, completion: nil)
            self.isHidden = false
        }
        func animHide(){
            UIView.animate(withDuration: 2, delay: 0, options: [.curveLinear],
                           animations: {
                            self.center.y += self.bounds.height
                            self.layoutIfNeeded()
    
            },  completion: {(_ completed: Bool) -> Void in
            self.isHidden = true
                })
        }
    }
    
    0 讨论(0)
  • 2021-02-02 13:08

    See my view case was opposite i am directly doing changes in that , test if it is working for you,

    Show Logic

    //Add your view on storyBoard / programmatically bellow tab bar
    
    [self.view bringSubviewToFront:self.miniMenuView];
    
    CGRect rectformedicationTableViewcell;// = CGRectZero;
    
    rectformedicationTableViewcell = CGRectMake(0.0f, self.view.frame.size.hight, self.view.frame.size.width, 150.0f);
    
    self.miniMenuView.frame = rectformedicationTableViewcell;
    
    if([self.miniMenuView superview]) {
        self.miniMenuView.hidden = YES;
    }
    self.miniMenuView.hidden = NO;
    
    [UIView animateWithDuration:0.3f
                          delay:0.0f
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                           [self.miniMenuView setFrame:CGRectMake(0.0f, self.view.frame.size.hight - 150.0f, self.view.frame.size.width, 150.0f)];
    
                     }
                     completion:nil];
    

    Hide Logic

    [self.view sendSubviewToBack:self.miniMenuView];
    
    [UIView animateWithDuration:0.3f
                          delay:0.0f
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
    
                                                     [self.miniMenuView setFrame:CGRectMake(0.0f, self.view.frame.size.hight, self.view.frame.size.width, 150.0f)];
    
    
                     }
                     completion:^(BOOL completed){
                         if([self.miniMenuView superview]) {
                             self.miniMenuView.hidden = YES;
                         }
    
                     }];
    

    Consider this as basic idea do changes as per your requirements Best luck.

    0 讨论(0)
  • 2021-02-02 13:09

    Assuming the original view is something like:

    var view = new UIView(new CGRect(View.Frame.Left, View.Frame.Height - 200, View.Frame.Right, 0));
    view.BackgroundColor = UIColor.Clear;
    

    Show:

    UIView.Animate(2.0, 0.0,
        UIViewAnimationOptions.CurveLinear,
        () =>
            {
                view.BackgroundColor = UIColor.Blue;
                var height = 100;
                view.Frame = new CGRect(View.Frame.Left, view.Frame.Y - height , view.Superview.Frame.Right, height);
            },
        () =>
            {
                // anim done
            }                                  
    );
    

    Hide:

    UIView.Animate(2.0, 0.0,
        UIViewAnimationOptions.CurveLinear,
        () =>
            {
                view.BackgroundColor = UIColor.Clear;
                var height = 100;
                view.Frame = new CGRect(View.Frame.Left, view.Frame.Y + height, view.Superview.Frame.Right, 0);
    
            },
        () =>
            {
                view.Hidden = true;
            }
    );
    

    0 讨论(0)
  • 2021-02-02 13:22

    I have also faced the issue like https://i.stack.imgur.com/fuVhy.gif commented https://stackoverflow.com/users/4793465/xtl for the above solution.

    Am using the view at the bottom of web-view to show and hide like safari mobile browser.

    attached the sample code below UIView *viewV; UILabel *label;

    and viewdidload

    -(void)viewDidLoad {
    [super viewDidLoad];
    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
    webView.navigationDelegate = self;
    webView.UIDelegate = self;
    webView.scrollView.delegate = self;
    NSURL *nsurl=[NSURL URLWithString:@"https://www.google.com/"];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [webView loadRequest:nsrequest];
    [self.view addSubview:webView];
    
    viewV = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 50, self.view.frame.size.width, 50)];
    viewV.backgroundColor = [UIColor blueColor];
    [webView addSubview:viewV];}
    

    and scroll view delegate

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint velocity = [[scrollView panGestureRecognizer] velocityInView:scrollView.superview];
    if (velocity.y == 0) {
        return;
    }
    if (velocity.y < -1) {
        // Scrolling left
        NSLog(@"Top");
        if (viewV.frame.origin.y != self.view.frame.size.height - 50) {// if already hidden, don't need to hide again
            return;
        }
        [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            viewV.backgroundColor = [UIColor clearColor];
            viewV.frame = CGRectMake(0, viewV.frame.origin.y + 50, self.view.frame.size.width, 0);
    
        } completion:^(BOOL finished) {
    
        }];
    } else if (velocity.y > 1) {
        // Scrolling Right
        NSLog(@"Bottom");
        if (viewV.frame.origin.y != self.view.frame.size.height) { // if already shown, no need to do show again
            return;
        }
        [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            viewV.backgroundColor = [UIColor blueColor];
            viewV.frame = CGRectMake(0, viewV.frame.origin.y - 50, self.view.frame.size.width, 50);
    
        } completion:^(BOOL finished) {
        }];
    }}
    

    This worked for me.

    0 讨论(0)
提交回复
热议问题