Swift 如何在滚动前使导航栏透明(iOS 14)

Swift 如何在滚动前使导航栏透明(iOS 14),swift,ios14,ion-navbar,Swift,Ios14,Ion Navbar,我想实现一个导航风格,就像苹果的提醒(iOS 14)中的“添加提醒”视图控制器一样。我已经尝试使用scrollview委托方法,但我不确定如何更改默认导航栏背景/阴影图像的alpha 我尝试过改变滚动条上的导航条样式,虽然效果不错,但不会像示例中那样淡入/淡出。这让我认为答案在于操纵alpha值。提前谢谢 我发现了一个(黑客)解决方案,可以在iOS 14中使用(其他版本未经测试)。它对UINavigationBar的私有视图结构进行了假设,因此不能保证它在未来的iOS版本中工作,但它不太可能崩

我想实现一个导航风格,就像苹果的提醒(iOS 14)中的“添加提醒”视图控制器一样。我已经尝试使用scrollview委托方法,但我不确定如何更改默认导航栏背景/阴影图像的alpha

我尝试过改变滚动条上的导航条样式,虽然效果不错,但不会像示例中那样淡入/淡出。这让我认为答案在于操纵alpha值。提前谢谢

我发现了一个(黑客)解决方案,可以在iOS 14中使用(其他版本未经测试)。它对
UINavigationBar
的私有视图结构进行了假设,因此不能保证它在未来的iOS版本中工作,但它不太可能崩溃——最糟糕的情况是,该条将无法隐藏,或仅部分隐藏

假设您将代码放置在
UIViewController
子类中,该子类充当
UITableView
UICollectionView
UIScrollView
的委托,则以下操作应能正常工作:

override func viewDidLoad() {
    super.viewDidLoad()
    // this hides the bar initially
    self.navigationController?.navigationBar.subviews.first?.alpha = 0
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard let navigationController = self.navigationController else { return }
    let navBarHeight = navigationController.navigationBar.frame.height
    let threshold: CGFloat = 20 // distance from bar where fade-in begins
    let alpha = (scrollView.contentOffset.y + navBarHeight + threshold) / threshold
    navigationController.navigationBar.subviews.first?.alpha = alpha
}

神奇的
阈值
值有点难以解释,但它基本上是从淡入开始的距离。值为20表示当scrollView内容距离20点时,该条开始淡入。值为0意味着scrollView内容一接触到滚动条,滚动条就会从完全透明直接捕捉到完全不透明。

您可能正在寻找我尝试过的滚动条,但我非常确定scrollEdgeAppearance仅适用于导航条。PrefersLangTitles=true。@aheze这正是我和其他一些人发现的,但如果你能让它工作起来,我很高兴错了哈哈“不知道如何更改默认导航栏背景/阴影图像的alpha”可能是对UINavigationBarAppearance属性的直接操作。@matt你可能是对的。在这一点上,我尝试了很多,只是不确定是哪一种。可能得把它们都翻过来,哈哈。这是我的媒体文章的链接。如果我正确地阅读了你的解决方案,那么我相信我们得出了相同的结论!我使用了滚动视图代理和一个插入导航栏的视图。这是一个很糟糕的问题,我们必须一起破解它,我希望苹果能让我们其他人都能使用它。AFAICT的主要区别在于我没有在导航栏中添加新视图,只是直接在已经存在的背景视图上设置alpha。