帧动画不起作用

Frame animation doesnt work

viewDidLoad :

topBarMenu = [[TopBarMenu alloc] initWithFrame:CGRectMake(0, 64, 1024, 0)];
    [self.view addSubview:topBarMenu];
    topBarMenu.clipsToBounds = YES;


- (void)menuButton_TouchUpInside:(TopBarIcon *)sender
{
    isTopBarMenuShown = !isTopBarMenuShown;

    if (isTopBarMenuShown) {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 64, 1024, 600);
                                }];
    }else {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 64, 1024, 0);
              }];
    }
}

在我的代码中,我想用动画显示和隐藏我的菜单。展示非常有台阶,看起来不太好。隐藏立即删除屏幕没有任何动画。如何解决这个问题?

试试这个

 if (sideView.frame.origin.x >= 0 )
    {
        [UIView animateKeyframesWithDuration:0.5 delay:0 options:UIViewKeyframeAnimationOptionBeginFromCurrentState animations:^{
            sideView.frame=CGRectMake(-400, 45, CGRectGetWidth(sideView.frame), CGRectGetHeight(sideView.frame));
        } completion:^(BOOL finished) {

        }];
    }

    else
    {
        [UIView animateKeyframesWithDuration:0.5 delay:0 options:UIViewKeyframeAnimationOptionBeginFromCurrentState animations:^{
            sideView.frame=CGRectMake(0, 45, CGRectGetWidth(sideView.frame), CGRectGetHeight(sideView.frame));
        } completion:^(BOOL finished)
         {

         }];
    }

当您使用自动布局和动画时,您需要设置常量。因此,在开始动画之前设置常量。因此,创建 y 位置约束的出口。

topbaryposition.constant=0; (IBOutlet of Top position (Y postion of Topbar))


- (void)menuButton_TouchUpInside:(TopBarIcon *)sender
{
    isTopBarMenuShown = !isTopBarMenuShown;

    if (isTopBarMenuShown) {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 64, 1024, 600);
                                }];
    }else {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 64, 1024, 0);
              }];
    }
}

类似于 ,

编辑:-

我发现了你的问题。

您的问题是当您隐藏 topbar.you 仅将高度设置为 0 但您还需要设置 y 时在 else 中看到框架位置为 0..

类似于 ,

topBarMenu.frame = CGRectMake(0, 0, 1024, 0);




- (void)menuButton_TouchUpInside:(TopBarIcon *)sender
{
    isTopBarMenuShown = !isTopBarMenuShown;

    if (isTopBarMenuShown) {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 64, 1024, 600);
                                }];
    }else {

        [UIView animateWithDuration:1.5 animations:^{
            topBarMenu.frame = CGRectMake(0, 0, 1024, 0);
              }];
    }
}

我觉得直接设置frame不是很好的方法,建议改frame比较合适。 如:

- (void)menuButton_TouchUpInside:(TopBarIcon *)sender
{
    isTopBarMenuShown = !isTopBarMenuShown;

    if (isTopBarMenuShown) {

        [UIView animateWithDuration:1.5 animations:^{
            CGRect rect = topBarMenu.frame;
            rect.size.height = 600.0f;
            topBarMenu.frame = rect;
            //topBarMenu.frame = CGRectMake(0, 64, 1024, 600);
                                }];
    } else {

        [UIView animateWithDuration:1.5 animations:^{
            CGRect rect = topBarMenu.frame;
            rect.size.height = 0.0f;
            topBarMenu.frame = rect;
            //topBarMenu.frame = CGRectMake(0, 64, 1024, 0);
              }];
    }
}