【问题标题】:UISearchController searchbar animation very slow first timeUISearchController 搜索栏动画第一次很慢
【发布时间】:2016-03-24 15:44:46
【问题描述】:

在 iOS 9 中,我正在使用 UISearchController 并在 UIViewController 中显示其搜索栏,当我第一次单击搜索栏并尝试了我能想到的一切都无济于事时,我遇到了很多滞后...下面是我的代码以及延迟发生的视频的链接 - 延迟发生在模拟器和我的设备上。

func setupUI() {
    self.view.backgroundColor = UIColor.whiteColor()

    // Required to properly display searchbar within nav & tabbar controllers
    self.extendedLayoutIncludesOpaqueBars = true // have tried setting this to false as well
    self.definesPresentationContext = true

    self.searchResultsController = AppDelegate.getViewController(ScheduleStoryboard.name, controllerName: ScheduleStoryboard.Identifiers.foodSearchResults) as? SearchResultsController

    self.searchController = UISearchController(searchResultsController: searchResultsController)
    self.searchController.searchResultsUpdater = self
    self.searchController.delegate = self
    self.searchController.dimsBackgroundDuringPresentation = true

    self.searchController.searchBar.delegate = self
    self.searchController.searchBar.placeholder = "Search foods..."
    self.searchController.searchBar.setBackgroundImage(UIImage(named: "background-searchbar")?.resizableImageWithCapInsets(UIEdgeInsetsMake(0, 0, 0, 0)), forBarPosition: .Any, barMetrics: .Default)
    self.searchController.searchBar.tintColor = UIColor.whiteColor()
    self.searchController.searchBar.sizeToFit()

    // this headerView does NOT belong to the tableView, its anchored on top of the tableView so that the searchbar remains fixed when scrolling
    self.headerView.addSubview(searchController.searchBar)

    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.tableHeaderView?.backgroundColor = UIColor.clearColor()
    self.tableView.tableHeaderView?.addBorder(.Bottom, color: UIColor.groupTableViewBackgroundColor(), width: 0.25)

    self.segmentedControl.tintColor = UIColor.genioBlue()
}

这里是视频的链接,显示正在发生的事情:http://sendvid.com/xgq81stx

谢谢!

【问题讨论】:

  • 您找到解决方法了吗?我面临着完全相同的问题
  • 对我来说也是同样的问题。我也没有找到解决办法。
  • 你在模拟器上测试它吗?或在您的 iPhone 或 iPad 上?模拟器通常是错误的,所以可以连接一个实际的设备来尝试一下。希望有帮助!如果有,请告诉我。
  • 还是同样的问题?我有完全相同的问题。第一次之后,一切顺利。
  • 我不知道这个错误的真正原因是什么,但就我而言,这是因为我在searchResultsController tableView 中添加了一个UIRefreshControl。删除它,不再有慢动画。

标签: ios swift uisearchbar uisearchcontroller


【解决方案1】:

我只创建过一次搜索控制器,但我使用 UITableViewController 作为我的基类。这是我的实现:

class SearchController: UITableViewController {
    let searchController = UISearchController(searchResultsController: nil)
    var items:[ArrayOfYourType]
    var filteredItems:[ArrayOfYourType]
    var scopeTitles:[String]?

override func viewDidLoad() {
    super.viewDidLoad()

    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar

    searchController.searchBar.scopeButtonTitles = scopeTitles
    searchController.searchBar.delegate = self
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if searchController.active {
        return filteredItems.count
    }
    return items.count
}

func filterContentForSearchText(searchText: String, scope: String = "All") {
    filteredItems = items.filter { item in
        //return true or false depending on your filter
        return true
    }
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        self.tableView.reloadData()
    })
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle,
        reuseIdentifier: nil)
    let item: String
    let category: String
    if searchController.active {
        item = filteredItems[indexPath.row].getTitle()
        category = filteredItems[indexPath.row].getCategory()
    }
    else {
        item = items[indexPath.row].getTitle()
        category = items[indexPath.row].getCategory()
    }
    cell.textLabel?.text = item
    cell.detailTextLabel?.text = category
    return cell
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    //your code here
}
}

//MARK: UISearchResultsUpdating
extension SearchController: UISearchResultsUpdating {
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        if let _ = scopeTitles {
            let searchBar = searchController.searchBar
            let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex]
            filterContentForSearchText(searchController.searchBar.text!,scope:scope)
        }
        else {
            filterContentForSearchText(searchController.searchBar.text!)
        }
    }
}

//MARK: UISearchBarDelegate
extension SearchController: UISearchBarDelegate {
    func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
        filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope])
    }
}

我希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    会不会是您用于背景搜索栏的图片太大?

    创建渐变可能会更快。这是一个很好的tutorial

    【讨论】:

    • 请在您的答案中包含解决方案,如果链接中断您的答案已消失。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多