在iOS 7中,使用水平翻转过渡模态视图控制器时,导航栏位置错误。

24

当我尝试在iOS7中使用水平翻转过渡模态视图控制器时,导航栏的原点位置从开始的(0, 0)跳到正确的位置(0,20)。是否可能使其与iOS6中表现相同?您可以在此处下载项目

我已经创建了一个自定义的导航栏如下:

@implementation MyCustomNavigationBar

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    UIImage *image = [UIImage imageNamed:@"Custom-Nav-Bar-BG.png"];


    [image drawInRect:CGRectMake(0,  0, self.frame.size.width, self.frame.size.height)];

    if (IOSVersion <7) {
    }else{
        self.translucent = NO;
        self.tintColor = [UIColor whiteColor];
        self.barStyle = UIBarStyleDefault;
        self.barTintColor = [UIColor redColor];

    }
}

@end

非常感激任何帮助。


你好,你解决了上面提到的问题吗? - suvi
你能告诉我如何解决iOS 7中的Filp转换问题吗? - suvi
@suvi请检查答案:) - lu yuan
3个回答

57

我和你有同样的问题。我认为这是iOS 7上UIKit的一个错误。

我在呈现的viewWillAppear方法中添加了一点代码。

     [self.navigationController.navigationBar.layer removeAllAnimations];

当我关闭这个视图时,我添加了:

-(IBAction)btnDonePressed:(id)sender {
    [UIView transitionWithView:self.navigationController.view
                      duration:0.75
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:nil
                    completion:nil];
    [self dismissViewControllerAnimated:YES completion:nil];
}

这对我有效,希望能帮到您。


2
这也适用于通过翻转动画呈现模态 UINavigationController 的segue。我在prepareForSegue中添加了带有 UIViewAnimationOptionTransitionFlipFromRight 选项的 UIView 转换,并解决了此错误的其余问题。我将提交一个带有示例项目的雷达。 - Matthew Crenshaw
这个修复方案对于4英寸的设备效果很好,但在3.5英寸的设备上仍然会出现问题。 - wkhatch
你能解释一下如何在原始视图中使用 if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) 吗? - mychar
这种方法有点用,它减轻了影响,但仍然存在,尽管很微妙。 - glasz
1
@NicolasMiari,看起来苹果已经解决了这个问题。我在iOS 9上没有这个问题。关于你的问题,我猜想苹果在检测后附加了一些动画来改变呈现视图的框架。有关iOS 7上导航栏的更多信息,请阅读此文http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on。我没有更干净的解决方案,这个答案只是我的解决方案。抱歉。 - Thanh Vũ Trần
显示剩余6条评论

4

与其使用 [navigationBar.layer removeAllAnimations]; 进行 "hacking",以下代码也可以实现相同的效果:

[UIView transitionWithView:self.view.window duration:FlipDuration options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
    [UIView performWithoutAnimation:^{
        [self presentViewController:modalController animated:NO completion:nil];
    }];
} completion:nil];

解决了这个问题,我认为这是比被采纳的答案更好的一个。 - Peter Lapisu

3

我尝试设置导航栏的“iOS 6/7 Delta”,但没有成功。你也试过吗? - lu yuan
这些答案给了我一些启示,我尝试着解决问题,但最终失败了。 - lu yuan
我看了你的演示,但在这里它运行良好,以下是数值:self.frame.size.height: 44.000000 version == 7 rect.size.height: 44.000000 self.frame.size.height: 44.000000 Test [430:a0b] version == 7 rect.size.height: 44.000000 - virantporwal
框架值是正确的,但过渡很奇怪,与iOS6中的差别很大。 - lu yuan
1
你能留下你的电子邮件吗?这样我就可以把过渡的录像发送给你。 - lu yuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接