iOS 7 自定义 UINavigationBar TitleView 在推送或弹出新视图控制器时移动

ios移动NBA

1个回答

写回答

Darling777

2025-06-13 22:15

+ 关注

IOS
IOS

IOS 7中,我们可以自定义UINavigatioNBAr的标题视图(TitleView),以增加应用程序的个性化和用户体验。然而,当我们推送或弹出新的视图控制器时,通常会遇到一个问题:标题视图无法随着导航栏的动画而移动,导致用户体验的不连贯。为了解决这个问题,我们需要对标题视图的位置进行调整,以适应导航栏的动画。

调整标题视图的位置

要在推送或弹出新视图控制器时移动自定义的UINavigatioNBAr的标题视图,我们需要通过监听导航栏的动画事件,并在每次动画完成后更新标题视图的位置。具体步骤如下:

1. 添加导航栏动画的监听器

Swift

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

// 添加导航栏动画的监听器

NotificationCenter.default.addObserver(self, selector: #selector(navigatioNBArAnimationDidFinish), name: NSNotification.Name.UINavigatioNBAr.didFinishAnimation, object: nil)

}

override func viewWillDisappear(_ animated: Bool) {

super.viewWillDisappear(animated)

// 移除导航栏动画的监听器

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UINavigatioNBAr.didFinishAnimation, object: nil)

}

2. 更新标题视图的位置

Swift

@objc func navigatioNBArAnimationDidFinish() {

// 获取导航栏的高度

let navigatioNBArHeight = navigationController?.navigatioNBAr.bounds.height ?? 0

// 获取标题视图的frame

var titleViewFrame = navigationItem.titleView?.frame ?? CGRect.zero

// 更新标题视图的Y坐标

titleViewFrame.origin.y = (navigatioNBArHeight - titleViewFrame.height) / 2

// 更新标题视图的frame

navigationItem.titleView?.frame = titleViewFrame

}

在上述代码中,我们首先在视图将要出现和消失的方法中添加和移除了导航栏动画的监听器。然后,在监听器的回调方法中,我们获取了导航栏的高度,并通过简单的计算更新了标题视图的位置。

案例代码

下面是一个简单的案例代码,演示了如何自定义UINavigatioNBAr的标题视图,并在推送或弹出新视图控制器时移动标题视图的位置。

Swift

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

// 创建标题视图

let titleLabel = UILabel()

titleLabel.text = "Custom Title"

titleLabel.textColor = .white

titleLabel.font = UIFont.boldSystemFont(ofSize: 18)

titleLabel.sizeToFit()

// 设置标题视图

navigationItem.titleView = titleLabel

}

override func viewWillAppear(_ animated: Bool) {

super.viewWillAppear(animated)

// 添加导航栏动画的监听器

NotificationCenter.default.addObserver(self, selector: #selector(navigatioNBArAnimationDidFinish), name: NSNotification.Name.UINavigatioNBAr.didFinishAnimation, object: nil)

}

override func viewWillDisappear(_ animated: Bool) {

super.viewWillDisappear(animated)

// 移除导航栏动画的监听器

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UINavigatioNBAr.didFinishAnimation, object: nil)

}

@objc func navigatioNBArAnimationDidFinish() {

// 获取导航栏的高度

let navigatioNBArHeight = navigationController?.navigatioNBAr.bounds.height ?? 0

// 获取标题视图的frame

var titleViewFrame = navigationItem.titleView?.frame ?? CGRect.zero

// 更新标题视图的Y坐标

titleViewFrame.origin.y = (navigatioNBArHeight - titleViewFrame.height) / 2

// 更新标题视图的frame

navigationItem.titleView?.frame = titleViewFrame

}

}

在上述案例代码中,我们在视图控制器的viewDidLoad方法中创建了一个UILabel作为自定义的标题视图,并将其设置为导航栏的标题视图。然后,通过添加和移除导航栏动画的监听器,在每次导航栏动画完成后更新标题视图的位置。

通过上述步骤,我们可以实现在推送或弹出新视图控制器时移动自定义的UINavigatioNBAr的标题视图。这样,用户在导航过程中就能够获得更加流畅和连贯的体验。希望本文对你在IOS开发中遇到的类似问题有所帮助!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号