gpt4 book ai didi

swift - xcode 11 beta 中的这种新导航栏行为是错误还是有意为之?

转载 作者:搜寻专家 更新时间:2023-10-30 22:12:17 24 4
gpt4 key购买 nike

我在 Xcode 11 beta 中编译我的一个应用程序后注意到,当设置了 prefersLargeTitles 时,导航栏没有背景。这是有意为之的行为吗?

我注意到消息应用现在是这样工作的,当向下滚动时可以看到一个大标题,没有导航栏背景。

下面是用于设置 navBar 属性的代码:

 override func viewWillAppear(_ animated: Bool) {
let textAttributes = [NSAttributedString.Key.foregroundColor:ThemeManager.shared.default1]
self.navigationController?.navigationBar.largeTitleTextAttributes = textAttributes
self.navigationController?.navigationBar.titleTextAttributes = textAttributes
self.navigationController?.navigationBar.tintColor = ThemeManager.shared.default1
self.navigationController?.setNavigationBarHidden(false, animated: true)
self.navigationController?.navigationBar.prefersLargeTitles = true
let nav = self.navigationItem
nav.title = "My Profile"
}

这里有几张图片显示了差异:

左,在 Xcode 10 上编译,右,Xcode 11 beta:

enter image description here enter image description here

在 11 Beta 版本上向上滚动后,背景会淡入。请注意,未在 Xcode 11 beta 中编译的应用程序仍将以正常方式运行,仅在编译后因某种原因发生变化。这是有意为之吗?我该如何恢复原来的行为?

最佳答案

这是 iOS 13 的预期行为。

Apple 的想法(在我看来很糟糕)是标题应该与内容合并以表明它是相关的。开始滚动后,当内容位于标题栏后面时,标题栏将呈现“正确”的外观。

这很糟糕的原因是因为每个人目前都在没有这种行为的情况下规划他们的所有 UI。因此,新行为应该是选择加入而不是强制每个人选择退出(即更改会破坏每个人的代码,如果您要破坏每个人的代码,至少您应该清楚如何保持经过验证的真实行为过去 10 年)。

在您的情况下,结果看起来很糟糕。在我的案例中,结果看起来也很糟糕。

Apple 没有给出答案,但说你应该使用

- scrollEdgeAppearance

从 UINavigationBar 来控制内容顶部与导航栏底部对齐时栏的外观...在我的例子中,此方法返回 nil,所以我目前不确定我们如何应该使用这个。

这似乎也在这里讨论:

New UINavigationBar appearance in detail pane of UISplitViewController in iOS 13

因此当前的解决方法在您的 View Controller 中似乎是这样的:

- (void)viewDidLoad;
{
[super viewDidLoad];
if (@available(iOS 13,*)){
UINavigationBar *bar =self.navigationController.navigationBar;
bar.scrollEdgeAppearance = bar.standardAppearance;
}
}

它有效,但如果它是预期的方法,我不知道......

编辑:

如前所述,这样做似乎确实会阻止对 UINavigationBar 的任何其他直接自定义。可能从这里调整 scrollEdgeAppearance 是可行的方法。丑陋的。丑陋的。丑。

编辑:进展......现在正在管理后台。您需要调用它而不是直接设置 barTint。

@interface UINavigationBar (Compatibility)
- (void)setCompatibleTint:(UIColor *)fg andBarTint:(UIColor *)bg;
@end

@implementation UINavigationBar (Compatibility)
- (void)setCompatibleTint:(UIColor *)fg andBarTint:(UIColor *)bg;
{
self.tintColor = fg;
self.barTintColor = bg;
if (@available(iOS 13,*)){
// we need to tell it to adopt old style behavior first
UINavigationBarAppearance *appearance = self.standardAppearance;
appearance.backgroundColor = bg;
NSDictionary *attributes = self.titleTextAttributes;
appearance.titleTextAttributes = attributes;
attributes = self.largeTitleTextAttributes;
appearance.largeTitleTextAttributes = attributes;
self.scrollEdgeAppearance = appearance;
self.standardAppearance = appearance;
self.compactAppearance = appearance;
}
}
@end

我还不能完全确定文本属性,但它似乎是从背景色中流出的。这是一个完整的 PITA。

将其设置为子类并覆盖 barTint 会更好,但当然很多 UIKit 对象会自己创建这些条,因此您不会获得子类。

关于swift - xcode 11 beta 中的这种新导航栏行为是错误还是有意为之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com