在自动布局中隐藏和显示元素

时间:2018-02-21 11:39:52

标签: ios objective-c

如果我点击导航栏中的搜索按钮,然后显示一个uisearchbar并且需要关闭,然后取消点击导航栏中的搜索按钮,然后隐藏uisearchbar并且表格需要移动到顶部。

请找到我要求的屏幕截图

Before clicking search icon

After clicking search icon

2 个答案:

答案 0 :(得分:1)

考虑到它是一个表,我会将该搜索面板实现为自定义UITableViewCell,并仅使用此单元格向tableView添加一个新部分。然后你将在表格中有两个部分:第一个是这个单元格,第二个是其余部分。

然后,您可以使用insertRows(at:with:)deleteRows(at:with:)来显示和隐藏该面板(支持动画)。你只需要有一些数据模型来确保tableView的状态始终是一致的(我将在你身上留下适当的cellForRowAt实现):

var isCurrentlyShowingSearchBar: Bool = false

func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return isCurrentlyShowingSearchBar ? 1 : 0
    case 1:
        return items.count
    default:
        fatalError()
    }
}



func showSearchBar() {
    // update model
    isCurrentlyShowingSearchBar = true
    // add cell
    tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
}

func hideSearchBar() {
    // update model
    isCurrentlyShowingSearchBar = false
    // remove cell
    tableView.deleteRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)
}

答案 1 :(得分:0)

这是隐藏和显示搜索栏的代码。

你需要参考像

这样的顶级约束
@IBOutlet weak var SearchTop: NSLayoutConstraint!
@IBOutlet weak var bar: UISearchBar!

在viewdidload中设置常量,如

override func viewDidLoad()
{
    super.viewDidLoad()
    SearchTop.constant = bar.frame.size.height * -1
    self.view.layoutIfNeeded()
}

然后实现搜索按钮的点击事件,如

@IBAction func onclickSearch(_ sender: Any) {
        if SearchTop.constant == 0
        {                
            SearchTop.constant = bar.frame.size.height * -1;
        }
        else
        {
            SearchTop.constant = 0;
        }
        UIView.animate(withDuration: 1) {
            self.view.layoutIfNeeded()
        }
    }