Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UI搜索栏的宽度和位置在选择时发生变化_Ios_Swift_Xcode_Uitableview_Uisearchbar - Fatal编程技术网

Ios UI搜索栏的宽度和位置在选择时发生变化

Ios UI搜索栏的宽度和位置在选择时发生变化,ios,swift,xcode,uitableview,uisearchbar,Ios,Swift,Xcode,Uitableview,Uisearchbar,我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我想不出来 我在UIViewController中有一个UITableView。在工具栏上,我有一个按钮,可以显示/隐藏搜索栏。除了搜索栏在选择时向上移动8个像素(UITableView和SuperView之间的原始边距)并在宽度上扩展到与整个SuperView相等这一令人恼火的事实之外,一切都很好 我已经修复了searchBarFrame()函数的宽度问题,但是,它将“Cancel”按钮一分为二,所以它并不完美(见下文

我有一个非常令人沮丧的问题,我确信有一个简单的解决方案,但对于我的生活,我想不出来

我在UIViewController中有一个UITableView。在工具栏上,我有一个按钮,可以显示/隐藏搜索栏。除了搜索栏在选择时向上移动8个像素(UITableView和SuperView之间的原始边距)并在宽度上扩展到与整个SuperView相等这一令人恼火的事实之外,一切都很好

我已经修复了searchBarFrame()函数的宽度问题,但是,它将“Cancel”按钮一分为二,所以它并不完美(见下文)。对于这两个问题,我真的很感激你的任何想法。基于我找到的其他解决方案,我尝试了扩展边和滚动视图插入的每一种组合,但都不管用。我真的不想使用导航栏作为搜索栏,也不想完全转换为UITableViewController。一定有办法做到这一点

以下是我的(相关?)代码:


我认为使用
NSLayoutConstraint
来定位和调整视图大小可以解决这个问题

例如:

private let margin: CGFloat = 15.0

tableView.translatesAutoresizingMaskIntoConstraints = false
searchBar.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    tableView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: margin),
    tableView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: margin),
    tableView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
    tableView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
    searchBar.widthAnchor.constraint(equalTo: tableView.widthAnchor)
])

跟进,以防其他人遇到此问题。经过大量的时间和努力,我从来没有得到我原来的设置工作。相反,我从零开始,并与之不同

在storyboard中(您也可以通过编程来实现这一点,但我走了一条更简单的路线,因为我受够了),我在UIView中的UIStackView中放置了一个UISearchBar。我将Stackview的前导和尾随约束设置为uitableview、uitableview的从下到上以及顶部布局视图的从上到下。UIView的唯一约束是高度为56(典型的搜索栏高度),优先级为999(如果要显示和隐藏)

这修复了一切,代码也非常简单

class MyVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
        searchView.isHidden = true
    }

    @IBAction func onSearchBtnPress(sender: UIBarButtonItem) {
        if searchView.isHidden {
            searchView.isHidden = false
        } else {
            searchView.isHidden = true
        }
    }
}

extension MyVC: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        // do something
}

在searchBarFrame()中,尝试打印“tableView.frame.size.width”,并检查是否打印了预期的宽度,以及您是如何设置tableView框架的?@vincent joy我使用故事板中的自动布局设置了视图。我在updateSearchResults中打印了两个框架,使用:
print(“搜索栏框架:\(self.view.convert(searchController.Searchbar.frame,to:searchController.Searchbar.superview)))print(“Tableview框架:\(Tableview.frame)”
这些是结果:搜索栏框架:(-20.0,0.0414.0,56.0)Tableview框架:(20.0,8.0,374.0,612.0)虽然我不需要调整tableview的位置,只需要调整搜索栏(searchcontroller.view),但听起来这可能会有所帮助。但是我应该把这个代码放在哪里呢?它不断地向我袭来。
class MyVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.delegate = self
        searchView.isHidden = true
    }

    @IBAction func onSearchBtnPress(sender: UIBarButtonItem) {
        if searchView.isHidden {
            searchView.isHidden = false
        } else {
            searchView.isHidden = true
        }
    }
}

extension MyVC: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        // do something
}