我有一个ipad应用程序,我想隐藏并显示一个类别列表(有点像分割视图控制器中的小视图),以及包含UiNavigationController堆栈的主视图。
我希望在隐藏类别列表时调整UINavigationController视图的大小以填充整个屏幕,并在显示列表时缩小。
我有它工作,除了在动画开始/提交块中设置帧时导航栏的标题立即跳转到它的新偏移。
任何想法如何阻止标题的跳跃?
答案 0 :(得分:3)
我用它来修复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 :(得分:2)
我最近遇到了类似的问题;我有一个动画视图的子视图,它立即跳到了新的位置。发生这种情况是因为我在该视图上调用了-layoutSubviews
,因为我在动画结束之前以编程方式修改它。您是否正在做更改标题文本或以某种方式修改标题文本以导致-layoutSubviews
被调用的内容?
答案 2 :(得分:1)
我的解决方案似乎可以解决我在应用中遇到的所有情况。显然仍然是一个黑客,所以不能保证它永远有效!
@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;
}
}
}
答案 3 :(得分:1)
当我在动画块中包含[self.navigationController.navigationBar layoutSubviews]
时,它对我来说很好。
这是代码示例:
[UIView animateWithDuration:0.5
animations:^{
[self.navigationController.navigationBar setFrame:newFrame];
[self.navigationController.navigationBar layoutSubviews];
}];
我希望这在某种程度上有所帮助。