iOS 11 UIRefreshControl 与 NavigationBar LargeTitle 和 SearchController 消失

swiftIOSNBA

1个回答

写回答

zhuxiaoying

2025-07-05 11:00

+ 关注

IOS
IOS

IOS开发中,使用UIRefreshControl可以为UIScrollView及其子类添加下拉刷新的功能,以提供更好的用户体验。然而,在IOS 11中,当我们同时使用UIRefreshControl、NavigatioNBAr的LargeTitle及SearchController时,可能会出现一些问题,例如它们可能会突然消失或者错位。下面我们将详细讨论这个问题,并提供相应的解决方案。

首先,让我们来看一下如何使用UIRefreshControl。我们可以通过以下代码将其添加到UITableView中:

Swift

let refreshControl = UIRefreshControl()

refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)

tableView.refreshControl = refreshControl

在这里,我们创建了一个UIRefreshControl的实例,并将其添加到UITableView的refreshControl属性中。然后,我们指定了一个刷新数据的方法,并将其与UIRefreshControl的valueChanged事件关联起来。

然而,当我们在IOS 11中使用UIRefreshControl时,可能会遇到一个问题,即当我们同时启用NavigatioNBAr的LargeTitle和SearchController时,UIRefreshControl可能会突然消失或者错位。这是因为IOS 11对于LargeTitle和SearchController的处理方式与之前的版本有所不同。

为了解决这个问题,我们可以尝试以下解决方案。首先,我们需要在ViewController中添加一个变量用于保存SearchController的状态:

Swift

var isSearchControllerActive = false

然后,在UITableViewDelegate的scrollViewDidScroll方法中,我们需要根据SearchController的状态来判断是否需要重新显示UIRefreshControl:

Swift

func scrollViewDidScroll(_ scrollView: UIScrollView) {

if isSearchControllerActive {

// 搜索控制器处于活跃状态时,不显示UIRefreshControl

return

}

if tableView.contentOffset.y < 0 {</p> // 当contentOffset的y小于0时,重新显示UIRefreshControl

tableView.refreshControl?.alpha = 1

} else {

// 否则隐藏UIRefreshControl,避免与NavigatioNBAr的LargeTitle冲突

tableView.refreshControl?.alpha = 0

}

}

在这里,我们首先判断SearchController是否处于活跃状态,如果是的话就不显示UIRefreshControl。然后,我们根据UITableView的contentOffset来判断是否需要重新显示UIRefreshControl,如果contentOffset的y小于0,则重新显示UIRefreshControl,否则隐藏它。

通过以上的解决方案,我们可以解决在IOS 11中使用UIRefreshControl时可能出现的NavigatioNBAr LargeTitle和SearchController消失的问题,从而提升我们应用的用户体验。

解决方案案例代码:

Swift

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!

var isSearchControllerActive = false

override func viewDidLoad() {

super.viewDidLoad()

let refreshControl = UIRefreshControl()

refreshControl.addTarget(self, action: #selector(refreshData), for: .valueChanged)

tableView.refreshControl = refreshControl

let searchController = UISearchController(searchResultsController: nil)

searchController.searchResultsUpdater = self

searchController.obscuresBackgroundDuringPresentation = false

searchController.searchBar.placeholder = "Search"

navigationItem.searchController = searchController

definesPresentationContext = true

tableView.delegate = self

}

@objc func refreshData() {

// 刷新数据

}

}

extension ViewController: UITableViewDelegate {

func scrollViewDidScroll(_ scrollView: UIScrollView) {

if isSearchControllerActive {

return

}

if tableView.contentOffset.y < 0 {</p> tableView.refreshControl?.alpha = 1

} else {

tableView.refreshControl?.alpha = 0

}

}

}

extension ViewController: UISearchResultsUpdating {

func updateSearchResults(for searchController: UISearchController) {

// 更新搜索结果

}

}

在以上的示例代码中,我们创建了一个ViewController,并在其中添加了UITableView、UIRefreshControl和UISearchController。然后,我们实现了UITableViewDelegate和UISearchResultsUpdating协议的方法,并在scrollViewDidScroll方法中处理了UIRefreshControl的显示和隐藏逻辑。

通过使用以上的解决方案,我们可以在IOS 11中同时使用UIRefreshControl、NavigatioNBAr的LargeTitle和SearchController,并避免它们之间的冲突问题。这将为我们的应用提供更好的用户体验。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号