使用 iOS 7 ***布局指南

Posted

技术标签:

【中文标题】使用 iOS 7 ***布局指南【英文标题】:Work with iOS 7 top layout guide 【发布时间】:2013-10-17 08:43:28 【问题描述】:

我正在我的故事板中设计一个视图控制器。它包含顶部的导航栏和内容视图。我已将约束设置为

导航栏顶部空间到顶部布局指南 = 0 内容视图填充剩余空间(超级视图的前导和尾随空间 = 0;超级视图的底部空间 = 0,导航栏的顶部空间 =0)

因为我要显示状态栏,所以我使用顶部布局指南让导航栏显示在它的正下方。它适用于标准 UINavigationBar。 但是我有自定义导航栏:我创建了自己的继承 UINavigationBar 的类。

问题是:在界面构建器的身份检查器中为导航栏指定此自定义类时,运行应用时导航栏不在正确的位置。

initWitFrameinitWithCoder 中是否有任何需要添加或修改的内容,或者还有其他事情要做,所以我的自定义导航栏将遵循我的故事板的约束。

编辑 - 添加源代码

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // additional setup
    
    return self;


- (id)initWithCoder:(NSCoder *)aDecoder

    self = [super initWithCoder:(NSCoder *)aDecoder];
    if (self) 
        // same setup than initWithFrame:
    
    return self;


- (void)drawRect:(CGRect)rect

    //[self setFrame:rect]; navigation bar is not at the right place if uncommented

【问题讨论】:

如果发现函数drawRect:被自动触发,将我的导航栏原点设置为(0,0)。如果您不覆盖它,我将失去我的栏的一些自定义设置,尤其是背景颜色。有什么线索吗? 当您不覆盖 drawRect: 时,它是否有效?你能显示你的自定义UINavigationBar的来源吗? 是的,它在不覆盖 drawRect: 时工作。但我失去了一些定制。我为来源编辑我的帖子。 【参考方案1】:

你为什么打电话给[self setFrame:rect];frame 此时已正确设置,您不应更改它。另外,rect 在导航栏的内部坐标系中。

【讨论】:

好的,感谢您的解释。但是为什么我需要覆盖drawRect: 并且什么都不做,否则我的导航栏看起来不像initWithCoder: 中定义的那样? @zbMax:你有什么代码:// additional setup?如果您没有在其中执行任何操作,则不应覆盖 drawRect:。我假设你也跳过了那里的一些代码。 @zbMax:您可能还想阅读View Programming Guide for ios 中的“定义自定义视图”部分。 在我的//additional setup 中,我只是设置了背景图片,并添加了自定义按钮。我已经按照您提到的部分进行了操作。我没有设置 autoresizingMask。但即使进行了这种修改,不覆盖 drawRect: 也会让我失去背景图像。 @zbMax:你能把不工作的代码分离到一个新项目中,然后在 Dropbox 上分享吗?因为现在我不确定它有什么问题。

以上是关于使用 iOS 7 ***布局指南的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 10 - iOS 9.0 [12] 之前的安全区域布局指南错误

iOS - 带有布局指南的 UITabBar 上方的 UIView

iOS - 顶部布局指南高度问题

iOS 9 和 10:使用安全区域布局指南时在屏幕顶部添加了空白区域

iOS7隐藏状态栏但不调整顶部布局指南

iOS 8 Xcode 6:使用顶部/底部布局指南进行顶部/底部约束时,应用程序始终崩溃