【问题标题】:iOS 7 UIToolBar Overriding With Status BariOS 7 UIToolBar 覆盖状态栏
【发布时间】:2013-09-26 23:11:35
【问题描述】:

我已将我的项目从 iOS 6 升级到 iOS 7,但似乎有点问题。状态栏和工具栏是最重要的并且彼此非常接近。工具栏之前是通过在情节提要中手动拖动来添加的。这是它的显示方式:

我看到了一些建议使用“positionForBar:”和“-(UIBarPosition)positionForBar:(id)bar”的问题,但我不知道如何使用它们,稍微解释一下和简单的方法这样做可能会有所帮助。谢谢!

更新:以下是一些也需要修复的代码。它之前工作正常,但由于 detailviewcontroller (WebViewController) 现在嵌入在导航控制器中,下面的代码导致异常。看来我需要修改这个方法的第一行。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

        WebViewController *wvc = [self.navigationController.parentViewController childViewControllers][1];
        RSSItem *entry = [[channel items] objectAtIndex:[indexPath row]];
        wvc.title = entry.title;
        wvc.urlString = entry.link;   
}

【问题讨论】:

    标签: ios objective-c ipad ios7 uitoolbar


    【解决方案1】:
    _toolBar.delegate = self;
    
    - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
        CGRect frame = _toolBar.frame;
        frame.origin = CGPointMake(0, [UIApplication sharedApplication].statusBarFrame.size.height);
        _toolBar.frame = frame;
    
        return UIBarPositionTopAttached;
    }
    

    portrait bar

    landscape bar

    【讨论】:

    • 如果视图位于超级视图内的容器中怎么办。那该怎么办呢?
    • 您的工具栏在容器内?
    • 工具栏在视图中,但该视图在容器内?我在您的答案中使用了代码,但没有用。知道我还应该改变什么才能让它工作吗?
    • 也许你的容器视图的 origin.y 是负数?尝试移动您的容器视图。并检查您的工具栏的自动调整大小掩码。它应该是 UIViewAutoresizingFlexibleTopMargin。
    • 如果您的应用需要纵向和横向,请使用 UIViewAutoresizingFlexibleWidth。
    【解决方案2】:

    您的视图的顶部约束不应再是超级视图的顶部空间,而是顶部空间顶部布局指南。

    您可以通过将顶部空间向下移动到状态栏下方,然后使用约束菜单将约束添加到最近的邻居,现在应该是顶部布局指南,或者您可以按照 @ 中的说明进行操作987654321@.

    【讨论】:

    • 这个链接对我很有帮助。我必须解决的一件事是 XCode 一直希望通过将 UIToolbar 的底部与顶部布局指南相关联来创建新的垂直间距约束,需要负值才能使事情看起来正确。为了欺骗 XCode 将 UIToolbar 的顶部与顶部布局指南相关联,我首先必须将其顶部向下移动到指南下方,然后创建约束。之后,我将约束值设置为零,这将两者结合在一起。
    【解决方案3】:

    请记住,您不应该仅仅出于两个原因在 IB 中下移内容:

    1. 不兼容 iOS 6
    2. 不会在状态栏下扩展顶栏背景效果

    所以,如果您想要 iOS6 和 iOS7 兼容性,您可以在 ViewDidLoad 中为需要自定义的对象添加条件。请注意,这是最后一种情况 - 始终尝试先使用自动布局/IB 来解决它:

    #import <Availability.h>
    
    #ifdef __IPHONE_7_0
    
            CGRect barFrame = topBar.frame;
            barFrame.origin = CGPointMake(0, [UIApplication sharedApplication].statusBarFrame.size.height);
            [topBar setFrame:barFrame];
    
            // move other stuff around too
    
        #endif
    

    并像上面的 Luniz 一样设置您的酒吧代表,将 positionForBar 覆盖为 .

    topBar.delegate = self;
    
    - (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
    
        return UIBarPositionTopAttached;
    }
    

    【讨论】:

    • 当然,整个第一部分可以通过简单地在 IB 中设置“使用全屏(折旧)”(又名 Wantsfullscreen)标志来解决。
    【解决方案4】:

    如果你的设置是一个拆分视图,比如有两个容器视图的设置,你应该可以这样做。设置容器视图时,向上拖动顶部,直到看到表示顶部位于状态栏底部的蓝色虚线。对两个容器视图执行此操作。将工具栏添加到嵌入式控制器(不是容器视图),固定在该控制器视图的顶部。将左视图嵌入导航控制器后,我的屏幕如下所示:

    【讨论】:

    • 我可以使用详细视图容器中的导航栏而不是工具栏。如您所知,我们为导航栏提供的颜色在 iOS 7 中也适用于状态栏,这就是我想要实现的目标。
    • @AJ112,当然。您可以将该控制器嵌入到导航控制器中,或者只是在导航栏中拖动。
    • 是的,我可以使用导航栏或在导航控制器中嵌入详细视图。使用工具栏它工作正常,我用在详细视图中拖动的导航栏替换了工具栏。它可以工作,但它会像工具栏一样与状态栏发生冲突。如果我手动将详细视图中的导航栏移动到 20 点以下,我仍然无法通过更改导航栏的颜色来更改状态栏的颜色。事实证明,手动拖动的导航栏并不会随之改变状态栏的颜色。
    • 第二个选项是在导航控制器中嵌入detailview。我尝试这样做,如果我希望 iOS 7 的状态栏和导航栏颜色相同,这是正确的做法。但它会引发异常。这是添加了导航栏的示例项目的链接jmp.sh/v/cutCPH6EkzQgotOerSLo
    • @AJ112,我不确定在什么情况下会出现异常,但这可能是因为您需要更改在详细控制器中定义 self.splitViewController 的方式。而不是 self.splitLikeController = (RDSplitLikeController *)self.parentViewController 你需要 self.splitLikeController = (RDSplitLikeController *)self.navigationController.parentViewController。当我将细节控制器嵌入到导航控制器中,更改了上面所说的内容并添加了条形按钮时,一切正常。
    【解决方案5】:

    我试图做几乎相同的事情,但我不喜欢接受答案的白色状态栏。我设法将工具栏置于状态栏下方,使其与主视图中旁边的导航栏颜色一致。

    我的解决方案是让工具栏高 64 磅,并将超级视图的 Topspace 设置为 0。

    执行此操作时,您必须确保您没有创建顶部空间布局指南的约束。通过将 Frame 设置为 0,0,高度为 64,我能够在 Interface Builder 中完成此操作。然后我使用浮动工具菜单中的 Pin 对话框。我在顶部 I 梁上使用零来创建约束。

    Master 和 Detail 的底部边缘匹配,颜色一致。我工具栏中的控件最终变得不拥挤。

    【讨论】:

    • 谢谢...向工具栏的高度添加 20 是我发现的唯一不需要自动布局的解决方案,它需要 iOS 6。我有很多 iPad 1 用户,所以我想要在我的应用中保持对 iOS 5 的支持。
    • 实际上当我增加工具栏的高度时,我发现工具栏标题(UIBarItem)保持底部对齐,但工具栏按钮(UIBarButtonItem)垂直居中——它们的位置太高了。我能找到调整位置的唯一方法是将工具栏按钮设置为 UIButton 设置为 UIBarButtonItem 的 customView,然后调整 UIButton 的框架。如果您需要将工具栏 tintColor 应用于按钮图标,则必须使用 UIImageView 而不是 UIButton。
    【解决方案6】:

    斯威夫特 3

    连接您的 bar 代理并符合 UIToolbarDelegate。然后添加这个委托方法:

    func position(for bar: UIBarPositioning) -> UIBarPosition {
        return UIBarPosition.topAttached
    }
    

    因为现在

    enum UIBarPosition : Int {
        case any
        case bottom
        case top
        case topAttached
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2015-11-29
      相关资源
      最近更新 更多