gpt4 book ai didi

uiview - SearchController 的 searchBar 添加为 UIView subview 未正确(重新)调整大小

转载 作者:行者123 更新时间:2023-12-03 21:27:38 24 4
gpt4 key购买 nike

我是 swift dev 和堆栈溢出的新手,如果有人能阐明我遇到的搜索栏大小问题,我将不胜感激。我无法正确调整屏幕中搜索栏的大小。我创建了一个简单版本的项目来简化奇怪行为的重现。它是一个带有 tableView 对象的单个 ViewController 来显示 searchBar 搜索的结果。我不希望搜索栏与表格单元格一起卷起,因此我在 Main.storyboard 中的 tableView 上方创建了一个 UIView 作为 searchBar 的占位符,并向它们添加了必要的约束,因此可以正确调整它们的大小不同的屏幕尺寸和方向——事实上,自动布局似乎工作正常。

请查看图片链接,因为我仍然无法在此处发布图片。 Main.storyboard image

我也不想在 Storyboard 中使用 UISearchBar 对象,因为我想稍后在我的代码中控制它。因此,我以编程方式将 SearchController searchBar 添加为 UIview subview ,其中(显然所有)需要与 UIview 一起调整大小的约束。此外,如您所见,tableView 和 UIView 的宽度比屏幕宽度小一点,这是我发现的其他帖子的一个不同之处,它们都完全拉伸(stretch)到屏幕边缘——我不知道这是否重要.我在 xcode 9.0.1 (9A1004) 上使用 swift 4。

问题:

如您所见,searchBar 右边缘越过 UIView 框架右边缘。当它被点击时,取消按钮也会超过屏幕限制。

searchBar image 1

更奇怪的是,当方向变为横向时,searchBar 的宽度最初并没有随着 UIView 拉伸(stretch)。但是当点击 searchBar 时,它的宽度会返回以超过屏幕限制。并且当点击取消时,searchBar 宽度继续大于屏幕宽度。无论我选择的屏幕尺寸和方向如何,都会发生此行为。

到目前为止我尝试了什么:

这个项目包含我能找到的所有推荐的属性和约束,除了属性 setTranslatesAutoresizingMaskIntoConstraints我没有设法使用。在swift 4上,我只找到了一个类似的translatesAutoresizingMaskIntoConstraints ,但我无法让它工作,它返回 “Cannot call value of non-function type 'Bool’” .

// searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(true)    
searchController.searchBar.translatesAutoresizingMaskIntoConstraints(true) (!) Cannot call value of non-function type 'Bool'

帖子 Display UISearchController's searchbar programmatically是一个非常好的,它与我的最相似(除了它向左延伸,而我的情况是向右),但效果不佳。我还意识到@kcstricks 将 searchBar 宽度设置为 self.view.frame.size.width 而不是 UIview 框架宽度。
// self.searchController.searchBar.frame.size.width = self.view.frame.size.width
self.searchController.searchBar.frame.size.width = searchBarPlaceholderView.frame.size.width

通过更改它,解决了最初的 searchBar 行为。现在它最初正确显示:

searchBar image 2

但是一旦被点击,奇怪的行为就会恢复,并且再也不会恢复正常。

searchBar image 3

searchBar image 4

我也尝试将主代码移动到 viewDidAppear 方法,但没有结果。
我哪里失败了?

其他研究过的堆栈溢出帖子:
Fixed UISearchBar using UISearchController - Not using header view of UITableView
UISearchController's searchBar doesn't fill full width
UISearchBar width doesn't change when its embedded inside a UINavigationBar

非常感谢您提前。

完整代码:
//  ViewController.swift
// SearchBarTests
// Copyright © 2017 equilibrio. All rights reserved.

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchResultsUpdating {

@IBOutlet var myTableView: UITableView!
@IBOutlet var searchBarPlaceholderView: UIView!

var searchController: UISearchController!

var selectedBeers = [Beer]()

struct Beer {
var type = String()
var examples = String()
}

var beers = [Beer(type: "American Lager", examples: "Budweiser, Coors, Pabst Blue Ribbon"),
Beer(type: "German Helles", examples: "Victory Helles Lager, Stoudt's Gold Lager"),
Beer(type: "German Pilsner", examples: "Tröegs Sunshine Pils, Bavaria, Sierra Nevada's Nooner Pilsner"),
Beer(type: "Belgian Gueuze", examples: "")]

// Delegates and Datasources
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.selectedBeers.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "cell")

cell.textLabel?.text = self.selectedBeers[indexPath.row].type
cell.detailTextLabel?.text = self.selectedBeers[indexPath.row].examples
return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("Row \(indexPath.row) selected")
}

func updateSearchResults(for searchController: UISearchController) {
if searchController.searchBar.text! == "" {
selectedBeers = beers
} else {
selectedBeers = beers.filter { $0.type.lowercased().contains(searchController.searchBar.text!.lowercased()) }
}

self.myTableView.reloadData()
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
selectedBeers = beers

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.dimsBackgroundDuringPresentation = false
self.searchController.searchBar.delegate = self
definesPresentationContext = true

self.searchBarPlaceholderView.addSubview(self.searchController.searchBar)
self.searchController.searchBar.searchBarStyle = UISearchBarStyle.minimal
// self.searchController.searchBar.frame.size.width = self.view.frame.size.width
self.searchController.searchBar.placeholder = "Type desired beer style..."
self.searchController.searchBar.frame.size.width = searchBarPlaceholderView.frame.size.width
self.searchController.searchBar.sizeToFit()

// searchController.searchBar.setTranslatesAutoresizingMaskIntoConstraints(false)
// searchController.searchBar.translatesAutoresizingMaskIntoConstraints(true)

self.myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
self.myTableView.reloadData()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}

最佳答案

我遇到过同样的问题。我到处都添加了框架调整代码。例如,当我从 tableview 建议列表中选择一个项目时,我会调用一个函数。在那个函数里面我写了下面的代码,所以搜索栏在动画后回到了我想要的宽度。我希望有人能提供更专业的解决方案。它在我的代码中看起来不太好,但可以工作。

func(youCallbyTapping) {


DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {

var searchBarFrame = self.fromSearchController.searchBar.frame
searchBarFrame.size.width = self.myFrom.frame.size.width - 15
self.fromSearchController.searchBar.frame = searchBarFrame
self.toSearchController.searchBar.frame = searchBarFrame
}
}

关于uiview - SearchController 的 searchBar 添加为 UIView subview 未正确(重新)调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922434/

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