UINavigationController:调整大小动画中的标题跳转
Posted
技术标签:
【中文标题】UINavigationController:调整大小动画中的标题跳转【英文标题】:UINavigationController: Title Jumps in Resize Animation 【发布时间】:2011-01-21 11:09:57 【问题描述】:我有一个 ipad 应用程序,我想在其中隐藏和显示一个类别列表(有点像拆分视图控制器中的小视图),以及包含 UiNavigationController 堆栈的主视图。
我想在隐藏类别列表时调整 UINavigationController 视图的大小以填满整个屏幕,并在我显示列表时缩小。
我有它的工作,除了导航栏的标题在动画开始/提交块中设置帧时立即跳转到新的偏移量。
任何想法如何停止标题的跳跃?
【问题讨论】:
【参考方案1】:我用它来修复 UINavigationBar 中标题和右键的跳转。
#import "UINavigationBar+My.h"
@implementation UINavigationBar (My)
- (void)layoutSubviews
for (id obj in [self subviews])
if ([NSStringFromClass([obj class]) isEqualToString:@"UINavigationItemView"])
[(UIView *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin];
else if ([NSStringFromClass([obj class]) isEqualToString:@"UIButton"])
if ([(UIButton *)obj center].x < ([self center].x / 2))
[(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
else
[(UIButton *)obj setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
@end
希望对你有帮助;-)
【讨论】:
您好,感谢您的回答 +1。你肯定给我指出了正确的方向,但我不能接受你的回答,因为它太可怕了!没有类检查......只有当你只有一个标题和 RHS 按钮时才有效(即不会处理后退按钮)。如果苹果改变视图顺序,那么它将打破..等等。请提交一个更强大的解决方案以使答案被接受(或者我会用我自己的解决方案来回答)!干杯:) 哈哈,那真是太可怕了! :) 这只是我项目中的一个快速修复。这是否更好?您的解决方案基于什么? 是的,这样更好,接受!也会发布我自己的……我认为你的无法处理后退按钮和其他一些可能的场景。【参考方案2】:我最近遇到了类似的问题;我有一个动画视图的子视图,它立即跳到新位置。发生这种情况是因为我在动画完成之前以编程方式修改了该视图,因此在该视图上调用了 -layoutSubviews
。您是否正在做一些事情,例如更改标题的文本或以某种方式对其进行修改以导致调用 -layoutSubviews
?
【讨论】:
我遇到过这样的情况,在viewWillAppear
中有一段名为layoutIfNeeded
的代码。移除layoutIfNeeded
移除了奇怪的动画。【参考方案3】:
我的解决方案似乎可以应对我在应用中遇到的所有情况。显然还是有点 hack,所以不能保证它会一直有效!
@implementation UINavigationBar (Nick)
- (void)layoutSubviews
[super layoutSubviews];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
UIView* titleView = nil;
CGFloat buttonWidths = 0;
for (UIView* subview in [self subviews])
if ([subview class] == NSClassFromString(@"UINavigationItemView"))
if (titleView)
// Exit here - if there is more than one title, probably doing a pop
return;
titleView = subview;
else if ([subview class] == [UIView class] || // bar button with custom view
[subview class] == NSClassFromString(@"UINavigationButton")) // or ordinary bar button
buttonWidths += subview.frame.size.width;
// is it RHS?
if (subview.frame.origin.x > subview.frame.size.width)
[subview setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
else
[subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
else if ([subview class] == NSClassFromString(@"UINavigationItemButtonView"))
// pretty sure this is always the back button
buttonWidths += subview.frame.size.width;
[subview setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];
if (titleView)
buttonWidths += 20; // seems to be apple indentation
CGRect rect = titleView.frame;
if (rect.size.width > self.frame.size.width - buttonWidths)
rect.size.width = self.frame.size.width - buttonWidths;
titleView.frame = rect;
titleView.center = self.center;
【讨论】:
【参考方案4】:当我将[self.navigationController.navigationBar layoutSubviews]
包含在动画块本身中时,它对我来说效果很好。
下面是代码示例:
[UIView animateWithDuration:0.5
animations:^
[self.navigationController.navigationBar setFrame:newFrame];
[self.navigationController.navigationBar layoutSubviews];
];
我希望这会有所帮助。
【讨论】:
不允许直接调用layoutSubviews
以上是关于UINavigationController:调整大小动画中的标题跳转的主要内容,如果未能解决你的问题,请参考以下文章
调整 UINavigationController 的大小?
使用 UINavigationController setToolbarHidden:animated 时如何调整视图大小:
使用平移关闭 UINavigationController 调整 UINavigationBar 相对于顶部安全区域的大小
如何在 UITabBarViewController 内的 UINavigationController 内调整 UITableView 的大小?
UINavigationController 总是全屏不调整大小
当 UISplitViewController 旋转为纵向时,如何调整 UINavigationController 内容的大小