UIView动画动画的位置,但不是宽度

时间:2010-03-23 03:25:09

标签: cocoa-touch uiview core-animation

我正在尝试转换UISearchBar,就像在Mobile Safari中一样:触摸搜索字段,它会在位置字段缩小时增长。

我当前改变搜索字段宽度和位置的动画只会动画显示位置:在它滑动到正确位置之前,它只是快速跳到正确的宽度。这是我的代码:

[UIView beginAnimations:@"searchGrowUp" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationDelegate:self];

CGFloat findFieldWidth = findField.frame.size.width;
CGFloat urlFieldWidth = urlField.frame.size.width;
CGRect findFieldFrame = findField.frame;
CGRect urlFieldFrame = urlField.frame;

findFieldFrame.origin.x = findFieldFrame.origin.x - 150.0f;
findFieldFrame.size.width = findFieldWidth + 150.0f;
urlFieldFrame.size.width = urlFieldWidth - 150.0f;

urlField.frame = urlFieldFrame;
findField.frame = findFieldFrame;

[UIView commitAnimations];

为了在这里展示,我稍微修改了这段代码,但我希望这能给出要点。

任何关于为什么会发生这种情况的猜测都会受到赞赏!

干杯, 亚伦。

4 个答案:

答案 0 :(得分:12)

感谢这篇文章:Changing the size of the UISearchBar TextField?

原来UISearchBar的内容不会与外层一起正确调整大小。所以你必须在搜索栏上设置框架后在动画块中调用-layoutSubviews :.所以该块结束如:

[findField setFrame:CGRectMake(findField.bounds.origin.y, findField.bounds.origin.y, findFieldWidth, findField.bounds.size.height)];
[findField layoutSubviews];

[UIView commitAnimations];

道具给尼克法里纳!

答案 1 :(得分:7)

尝试设置UISearchBar的宽度时,我遇到了同样的问题。

在iOS 4及更高版本中,我发现使用UIViewAnimationOptionLayoutSubviews作为

的选项
+[UIView animateWithDuration:delay:options:animations:completion:]

修好了。

答案 2 :(得分:3)

接受的答案有效,但根据Apple文档,您“不应该调用此方法”。干净的解决方案是使用layoutIfNeeded方法:

[UIView animateWithDuration:UINavigationControllerHideShowBarDuration
                      delay:0.f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{

    [searchBar setFrame: ...
    [searchBar layoutIfNeeded];

    ...

享受!

答案 3 :(得分:1)

抱歉这有点旧,但我遇到了类似的问题。 我不想使用layoutSubviews,因为文档说你不应该直接调用该方法。

我为解决我的问题所做的是在动画块的子视图中调用 sizeToFit