我正在开发一个在UITableView上面有自定义视图的功能,看起来TableView有contentInset。我将SearchController添加到了TableViewHeader,但是当我点击searchTextView时,SearchController会向上移动动画(大约20px)。我希望UISearchBar将位于ViewController的顶部,如“Constacts”
此屏幕截图显示了现在的情况:
这个是我想要的:
我该怎么办?我在搜索后需要contentInset(用户点击取消),但在搜索过程中我不需要它。
我想提供应用示例,演示所有这些内容 - > enter link description here
答案 0 :(得分:7)
如果您使用的是故事板您应该单击为您的tableview设置的视图控制器或TableView控制器,然后转到其属性检查器并查看ViewController部分并查看Extend Edges部分在顶级酒吧之下。
**OR**
检查顶部条形图和不透明条纹下方,并且未选中底部条形图。
执行此操作:
或强> 做这个:
答案 1 :(得分:5)
尝试在界面构建器中使用Adjust Scroll View Insets
,Under Top Bars
和Under Bottom Bars
。我有一个与collectionView相同的问题,切换它们为我工作。你的示例项目适用于我,但当我在这些设置之间切换时,它会中断。
答案 2 :(得分:2)
将以下代码添加到viewWillAppear()
self.automaticallyAdjustsScrollViewInsets = false
答案 3 :(得分:1)
每次触发searchBar开始/结束编辑时,如何调整内容插入:
// MARK: - UISearchBarDelegate
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
UIView.transition(with: self.tableView,
duration: 0.6,
options: .curveLinear,
animations: {
self.tableView.contentInset = UIEdgeInsets.zero
}, completion: { success in })
return true
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
UIView.transition(with: self.tableView,
duration: 0.6,
options: .curveLinear,
animations: {
self.tableView.contentInset = UIEdgeInsets(top: 100, left: 0, bottom: 0, right: 0)
}, completion: { success in })
}
答案 4 :(得分:1)
创建一个临时UISearchBar并将其指定为tableHeaderView
searchbar = UISearchBar(frame: CGRect(x: 0, y: 0, width: 375, height: 44))
searchbar?.delegate = self
tableView.tableHeaderView = searchbar
在searchBar点击之前呈现UISearchController来复制动画
func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
if searchBar == searchbar {
self.tableView.tableHeaderView = nil
UIView.animate(withDuration: 0.33, animations: {
// 64+44 is due because the navigation gets hidden and also because of the temp searchBar as tableHeaderView
self.tableView.contentInset = UIEdgeInsets(top: 64+44, left: 0, bottom: 0, right: 0)
}, completion: { _ in
})
self.present(searchController, animated: true, completion: nil)
}
return false
}
最后在UISearchController上取消按钮searchBar重置tableView contentInset
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
if searchBar == searchController.searchBar {
UIView.animate(withDuration: 0.33, animations: {
self.tableView.contentInset = UIEdgeInsets(top: 100+44, left: 0, bottom: 0, right: 0)
}, completion: { _ in
})
self.searchbar?.isHidden = false
self.tableView.tableHeaderView = self.searchbar
}
}
答案 5 :(得分:0)
我有类似的问题我通过将edgesForExtendedLayout
设置为无来修复它,
但是在研究之后,解决方案可能会有所不同,具体取决于您的层次结构的实现,您可能需要从故事板中取消选中Extend Edges Under Top Bar
。
答案 6 :(得分:0)
首先,我查看了您链接的项目,在Objective-C版本中没有内容插入,它只是一个普通的表格视图。
至于你的问题,让我确定我理解。这就是你需要的:
右?
假设这是真的,这是我的想法。
首先,我会抛弃UITableViewController
并将其更改为UIViewController
。将表视图添加为子视图并从视图控制器管理其位置。这意味着你不会乱搞内容插入,你只需将表放在图像下方即可。我不确定您是否想要图像上方或下方的搜索栏,但假设它位于下方,仍然只是将其保留为表格视图的标题,当它变为活动状态时,只需将表格视图和图像设置为动画直到图像已经消失,桌面视图位于顶部。如果您希望搜索栏位于图片上方,则不要将其添加到表格视图中,而是将其添加为主视图的子视图,将所有内容分开,并通过代码管理它的位置而不是让操作系统处理它。此外,搜索控制器可能存在问题,我还没有使用它,所以我不确定,但您可能最好只使用UISearchBar
并自己处理所有搜索。
答案 7 :(得分:0)
答案 8 :(得分:0)
实际上,视图控制器正在尝试自动调整UITableView
的内容插入等于导航栏高度。
取消选中Adjust Scroll View Insets
可以解决您的问题。我在使用故事板时也遇到过这个问题。
答案 9 :(得分:0)
看起来你正试图调整ViewController中的tableView,如果是这样的情况你可以通过在tableView对象上添加空视图并在storyboard中的navigationBar下来修复它,并给它这样的约束。
我知道这是一种hackie但是这将解决你的问题,实现searchController我在我的项目中使用它并且它工作正常
var searchController: UISearchController?
override func viewDidLoad() {
super.viewDidLoad()
searchController?.isActive = true
searchController = initSearchController()
}
func initSearchController() -> UISearchController {
let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.delegate = self
searchController.hidesNavigationBarDuringPresentation = true
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
searchController.searchBar.searchBarStyle = .minimal
searchController.searchBar.sizeToFit()
self.tableView.tableHeaderView = searchController.searchBar
tableView.contentOffset = CGPoint(x: 0, y:
searchController.searchBar.frame.size.height)
return searchController
}
希望这会有所帮助
答案 10 :(得分:0)
我相信您使用的是导航控制器,它在tableView上方引入了navigationBar。所以你需要做两件事。
答案 11 :(得分:0)
我只是将self.extendedLayoutIncludesOpaqueBars
设为真正解决了我的问题。
答案 12 :(得分:0)
我在UIViewController中附加了UISearchBar时也遇到了同样的问题,搜索栏下方是一个UICollectionView,因此该错误报告是,如果我向下滚动列表(UICollectionView),则默认情况下OS将自动调整scrollview 。
通常可以在viewDidLoad或viewWillAppear下的视图设置功能中禁用这种行为:
$_GET['id'];
参考: