iOS 11 - 在使用大标题模式时,UINavigationItem的titleView如何显示?

11

我正在尝试理解这是一个错误还是预期行为。

iOS 10及更早版本中,我们可以使用navigationItem.titleView设置自定义标题。
iOS 11中,当设置navigationItem.largeTitleDisplayMode = .always并设置navigationItem.titleView =<Some cool UIButton>时,它会同时显示正常的导航标题栏和大型导航标题。

示例图: enter image description here

总结:

如何在大型导航标题上使用自定义titleView?

编辑:以下是预期结果:

enter image description here


我们如何在大型导航标题上使用自定义titleView?你正在做这件事,这就是整个重点!以前,您无法同时拥有标题和标题视图。现在可以了。不要担心,保持愉快。 - matt
1
@matt 我明白。但我正在寻找使用自定义视图更改大标题的选项。已更新预期结果。 - Roi Mulia
2
好了,别再期望那个结果了!你误解了这个功能。 - matt
2个回答

6

我在文档中找不到关于这个的任何资料,所以我尝试了一下。似乎在iOS 11中,你将无法将标题作为按钮显示在左边并且让它变大。

我不知道这是一个bug还是预期结果,因为它似乎是一个新功能。最新的(iOS 11)人机界面指南(HIG)讨论了更大的标题标签作为提供给用户清晰上下文的一种方式。 HIG还讨论了按钮之间的间隔。但是,没有讨论使用按钮作为标题。


要重新创建,请设置一个单视图项目,并在其中嵌入视图控制器到导航控制器中。

ViewController.swiftviewDidLoad中,我添加了以下代码:

    let titleButton = UIButton(type: .roundedRect)
    titleButton.setTitle("Hello Button!", for: UIControlState.normal)

    let navController = parent as! UINavigationController

    navController.navigationBar.topItem!.title = "Hello???"
    navController.navigationBar.topItem!.titleView = titleButton
    navController.navigationBar.prefersLargeTitles = true

这最终看起来会像你的示例一样。

如果我

  • .title设置为空字符串或注释掉该行:导航栏被拉伸,没有标题文本显示(或在Interface Builder中设置的标题文本显示)

  • 注释掉.prefersLargeTitles,或将其设置为false:导航栏是正常高度,按钮显示,但没有标题文本显示。

  • 注释掉titleView行,然后:

    • .prefersLargeTitles设置为true:左侧显示大号title文本,并且导航栏的高度被拉伸。
    • .prefersLargeTitles设置为false:顶部中心显示title文本,并且导航栏高度正常。

更新:链接到GitHub上的示例项目


嗨,Leanne,调查得不错。据我所知,无法实现可点击的大标题?:\ - Roi Mulia
看起来是这样的。你可以尝试向苹果报告此问题,以了解他们的回应。如果需要,可以将我的示例链接作为演示,或者分支它以添加更多自己的信息。 - leanne

4

通过使用UINavigationBar的子类并手动更改视图层次结构,我成功将导航栏大标题替换为自定义视图:

@interface MYNavigationBar : UINavigationBar

@end

@implementation MYNavigationBar

// ...

- (void)layoutIfNeeded
{
    [self setupTitle];
    [super layoutIfNeeded];
}

- (void)setupTitle
{
    // UINavigationBar
    // -> ...
    // -> _UINavigationBarLargeTitleView
    //   -> UILabel << Big Title Label
    //   -> UIView
    //     -> UILabel << Big Title Label animating from back button during transitions

    for (UIView *view in self.subviews) {
        NSString *className = NSStringFromClass(view.classForCoder);
        if ([className containsString:@"LargeTitleView"]) {
            for (UIView *view2 in view.subviews) {
                if ([view2 isKindOfClass:[UILabel class]]) {
                    [self convertLabel:(UILabel *)view2];
                }
                for (UIView *view3 in view2.subviews) {
                    if ([view3 isKindOfClass:[UILabel class]]) {
                        [self convertLabel:(UILabel *)view3];
                    }
                }
            }
        }
    }
}

- (void)convertLabel:(UILabel*)label
{
    // I kept the original label in the hierarchy (with the background color as text color)
    // and added my custom view as a subview. 
    // This allow the transformations applied to the original label to be also applied to mine.
}

请注意,由于这一技巧,苹果公司可能会拒绝您的应用。

虽然这可能会导致被拒绝,但这是一个很好的答案!无论如何,似乎苹果不会很快更改私有类名,如果UI看起来不错,我打赌他们永远不会在意。干得好! - Roi Mulia
想知道您是否能够提交应用程序到App Store,因为类名是私有的。 - Gangadhar
我在审核过程中没有遇到任何问题,但我不能百分之百地说它是安全的。 - Axel Guilmin

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