我在iPad上使用UIView动画遇到了一些麻烦。

我正在开发一个项目,我在其中使用JTRevealSidebar框架在左侧实现了“facebook style”菜单。

然而,这个框架完美地运行,而不是将右侧视图“推”出屏幕,我想调整它的大小,因此用户仍然可以看到右侧视图的整个内容。

我设法通过更改视图的框架以及执行偏移来实现此目的。

这是侧边栏打开时的样子:

在此输入图像描述

当它关闭时:

在此输入图像描述

这个右侧视图包含一个带有两个按钮的导航栏(左侧有一个按钮可切换左侧边栏,右侧有另一个按钮可以关闭控制器),内容本身就是一个简单的UIWebView。

我面临的问题是在动画期间(从全屏状态到侧边栏打开状态):

当我更改视图的帧时,即使在执行转换后,视图也会在动画开始之前调整大小,这会产生如下奇怪的效果:

在此输入图像描述

我想保持webview的右侧固定在屏幕的右侧,并且在动画时只有左侧更改位置(基本上使“完成”按钮始终处于相同位置)。

这是动画代码:

- (void)revealSidebar:(BOOL)shouldReveal {

    if (shouldReveal) {

        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.3];

        // Push the view to the right
        contentView.transform = CGAffineTransformTranslate(contentView.transform, CGRectGetWidth(sidebarView.frame), 0);

        // Resize the view so it fits on remaining part of the screen
        contentView.frame = CGRectMake(contentView.frame.origin.x, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);


        // The problem is here: the view's frame is changed before the
        // Translate transformation actualy starts...
        //
        // Is there a way to change the x origin and the width simultaneously ?

        [UIView commitAnimations];


    } else {
        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.3];

        // Reset the frame so that it takes up whole screen
        contentView.frame = CGRectMake(contentView.bounds.origin.x,contentView.bounds.origin.y,contentView.frame.size.width+sidebarView.frame.size.width,contentView.frame.size.height);

        [UIView commitAnimations];
    }

    _state.isShowing = shouldReveal ? 1 : 0;
}

到目前为止,我没有运气,如果有人对如何实现这一目标有任何想法,我就会徘徊。

谢谢

===============>>#1 票数:2

编辑2:

似乎子视图正在立即调整使用的二重奏翻译。 所以也许你可以动画向右移动,然后在完成后设置宽度:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    contentView.frame = CGRectMake(CGRectGetWidth(sidebarView.frame), 0,     contentView.frame.size.width-CGRectGetWidth(sidebarView.frame),     contentView.frame.size.height);
}

- (void)animationDidStopBack:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {   
    contentView.frame = contentView.bounds;
}

- (void)revealSidebar:(BOOL)shouldReveal {     
    if (shouldReveal) {
        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.1];
        [UIView setAnimationDelegate:self];
        contentView.frame = CGRectOffset(contentView.bounds, CGRectGetWidth(sidebarView.frame), 0);
        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        [UIView commitAnimations];
    } else {
        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.3];
        [UIView setAnimationDelegate:self];
    contentView.frame = CGRectMake(0, 0, contentView.frame.size.width+CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
        [UIView setAnimationDidStopSelector:@selector(animationDidStopBack:finished:context:)];
        [UIView commitAnimations];
    }
    _state.isShowing = shouldReveal ? 1 : 0;
}

它并不完美,但确实避开了右侧的空白区域,因此我感觉看起来更好。 特别是如果你加快动画。

编辑1:

尝试:

[UIView beginAnimations:@"" context:nil];
[UIView setAnimationDuration:0.3];
if (shouldReveal) {
    contentView.frame = CGRectMake(CGRectGetWidth(sidebarView.frame), 0, contentView.frame.size.width-CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
} else {
    contentView.frame = CGRectMake(0, 0, contentView.frame.size.width+CGRectGetWidth(sidebarView.frame), contentView.frame.size.height);
}
[UIView commitAnimations];

旧答案:

声音/看起来你只需要修改x位置,始终位于侧边栏的边缘。 假设您的contentview的起源位于最左侧,未经测试的代码:

- (void)revealSidebar:(BOOL)shouldReveal {

    if (shouldReveal) {

        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.3];

        // Push the view to the right
        contentView.transform = CGAffineTransformTranslate(contentView.transform, CGRectGetWidth(sidebarView.frame), 0);

        // Resize the view so it fits on remaining part of the screen
        contentView.frame = CGRectMake(contentView.frame.origin.x, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);

        [UIView commitAnimations];

    } else {
        [UIView beginAnimations:@"" context:nil];
        [UIView setAnimationDuration:0.3];

        // Resize the view so it fits on full screen
        contentView.frame = CGRectMake(sidebarView.frame.size.width, contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);

        [UIView commitAnimations];
    }

    _state.isShowing = shouldReveal ? 1 : 0;
}

如果原点实际上居中,那么:

contentView.frame = CGRectMake(sidebarView.frame.size.width+(contentView.frame.size.width/2), contentView.frame.origin.y, contentView.frame.size.width-sidebarView.frame.size.width, contentView.frame.size.height);

  ask by Mutix translate from so

未解决问题?本站智能推荐:

3回复

ios UIView动画使用块问题

我正在尝试使用样式将旧样式的动画转换为块。 以下代码可以正常工作: 但是,这种转换将无法正常工作: 它说: 我在iPad模拟器上使用ios 4.1。 它可以编译,但总是崩溃。 无法找出问题所在。 甚至来自apple dev的简单示例: 以相同的方式工作-只
2回复

UIView动画中的setFrame不会移动,只会卡入到位

在我的viewDidLoad方法中,我将一个按钮放在视图的左侧,屏幕外。 然后我使用这两种方法来动画它: 方法: 该按钮立即出现,不会设置动画。 此外,立即调用animationDone选择器。 为什么不将我的按钮设置为屏幕动画? 编辑:这必须与在viewDi
1回复

传递动画数组时应用程序崩溃

我认为将一组动画传递给一个内部函数来运行所有动画是一个绝妙的主意,因此我不需要将动画嵌套在彼此之间以及彼此的完成块中。 所以我写了一种方法来测试这一点,然后猜怎么着,它崩溃了。 但是我不明白为什么。 这是我的方法: 我通过这样的动画: 当我调试它时,它会遍历我所有的动画,并
3回复

iOS-UIView动画的限制?

所以我正在制作一个简单的琐事游戏,并且我的timerView随着时间的流逝而缩小。 当用户选择答案时,它需要立即停止缩小-它必须非常敏感。 我给用户每个问题10秒的时间。 最初,我会设置10次动画(持续时间为1.0f),在上一个动画的完成块中调用动画的下一个“段”。 在完成模块中,我将检
2回复

UIView动画iOS,Bizzarre

我可能正在做一些非常愚蠢的事情,但我不知道为什么这行不通。 我正在尝试执行简单的UIView块动画,但是遇到了麻烦。 我已经在测试项目中重新创建了。 我在View控制器上有一个视图,当我按下按钮时,我创建了一个新视图,并将其框架设置在当前视图之外(在其上方)。 我想为过渡设置动画
1回复

iOS UiView动画在ios 5和ios 6设备上产生不同的效果

我在ios应用程序中创建了缩放动画,它在ios 6设备上可以正常工作,但是当我在包含ios 5的设备上运行相同的代码时,其行为有所不同,那就是按钮(我将其置于此效果)伴随着拉伸和延迟效果。 任何人都可以请看一下代码并签出我误会的内容。 码
1回复

uiview在动画iOS上的透视图

我一直在寻找,但找不到似乎解决我的具体问题的答案。 在我的应用程序中,我有一个Book View,我将使用UIViewAnimationTransitionFlipFromRight为其设置动画。 我的代码, 但我需要3D动画。 我需要用透视图显示UIView,如下图所示,
2回复

一个UIView动画取消了iOS中的另一个动画

在我的iOS应用程序中,我正在尝试同时执行2个动画。 但是,下面的代码不能满足我的要求。 它取消了第一个动画,只取消了第二个动画(来自通知的动画)。 至于第一个就在1秒之后才到达最终结果。 任何形式的帮助都非常感谢!
2回复

使用动画更改UIView背景颜色

我想用过渡动画改变我的UIView背景颜色。 例如,如果视图为红色,我将其更改为蓝色。 蓝色将从屏幕底部向上滑动到顶部并填满整个屏幕。 我想通过制作具有所需颜色的相同尺寸的UIView ,然后从屏幕上直到顶部制作动画来实现这一点。 尽管如此,这似乎并不是一种非常优雅的方式。 有没有更好
1回复

UIView动画警告

我正在使用以下代码 我收到以下警告 怎么解决这个?