由于with tableview inset

时间:2017-06-08 13:11:19

标签: ios swift uitableview swift3 uikit

我正在开发一个在UITableView上面有自定义视图的功能,看起来TableView有contentInset。我将SearchController添加到了TableViewHeader,但是当我点击searchTextView时,SearchController会向上移动动画(大约20px)。我希望UISearchBar将位于ViewController的顶部,如“Constacts”

此屏幕截图显示了现在的情况:

enter image description here

这个是我想要的:

enter image description here

我该怎么办?我在搜索后需要contentInset(用户点击取消),但在搜索过程中我不需要它。

我想提供应用示例,演示所有这些内容 - > enter link description here

13 个答案:

答案 0 :(得分:7)

如果您使用的是故事板您应该单击为您的tableview设置的视图控制器或TableView控制器,然后转到其属性检查器并查看ViewController部分并查看Extend Edges部分在顶级酒吧之下。

                      **OR**

检查顶部条形图和不透明条纹下方,并且未选中底部条形图。

执行此操作:

option 1

做这个:

option2

答案 1 :(得分:5)

尝试在界面构建器中使用Adjust Scroll View InsetsUnder Top BarsUnder Bottom Bars。我有一个与collectionView相同的问题,切换它们为我工作。你的示例项目适用于我,但当我在这些设置之间切换时,它会中断。

enter image description here

enter image description here

答案 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)

  1. 创建一个临时UISearchBar并将其指定为tableHeaderView

    searchbar   =   UISearchBar(frame: CGRect(x: 0, y: 0, width: 375, height: 44))
    searchbar?.delegate =   self
    tableView.tableHeaderView = searchbar
    
  2. 在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
    
    }
    
  3. 最后在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版本中没有内容插入,它只是一个普通的表格视图。

至于你的问题,让我确定我理解。这就是你需要的:

  1. 表格视图
  2. 图片上方没有改变位置的桌面视图,不会滚动,只是停留在那里
  3. 搜索栏位于表格顶部,但位于固定图片下方
  4. 当用户搜索时,隐藏图片并将表格视图一直抬高
  5. 当用户完成搜索时,您希望表格下降,以便图像可以再次显示在顶部
  6. 右?

    假设这是真的,这是我的想法。

    首先,我会抛弃UITableViewController并将其更改为UIViewController。将表视图添加为子视图并从视图控制器管理其位置。这意味着你不会乱搞内容插入,你只需将表放在图像下方即可。我不确定您是否想要图像上方或下方的搜索栏,但假设它位于下方,仍然只是将其保留为表格视图的标题,当它变为活动状态时,只需将表格视图和图像设置为动画直到图像已经消失,桌面视图位于顶部。如果您希望搜索栏位于图片上方,则不要将其添加到表格视图中,而是将其添加为主视图的子视图,将所有内容分开,并通过代码管理它的位置而不是让操作系统处理它。此外,搜索控制器可能存在问题,我还没有使用它,所以我不确定,但您可能最好只使用UISearchBar并自己处理所有搜索。

    祝你好运!

答案 7 :(得分:0)

我认为您的YourVC(具有SearchBar和Table View的VC)嵌入在NavigationController中,或者只是被嵌入的VC推送。

请查看我为您创建的Sample

注意:

  1. 放入CustomView高度约束(上:0,前导:0,尾随:0,高度:60)。
  2. 将搜索栏放在自定义视图中,将搜索栏上的约束添加为(顶部:20,前导:0,尾部:0,底部:0)。
  3. 将最小的SearchBarStyle用于searchBar。
  4. 在搜索栏中启用“取消”按钮。
  5. 使用拾色器为自定义视图提供与搜索栏颜色相同的背景颜色。
  6. 将TableView放在customView下面并给出约束为(与自定义视图的垂直间距:0,前导:0,尾随:0,底部:0)。
  7. 取消选中“调整滚动视图插图”,如下图所示。Uncheck the "Adjust scroll View Insets"
  8. 希望这能解决您的问题。

答案 8 :(得分:0)

实际上,视图控制器正在尝试自动调整UITableView的内容插入等于导航栏高度。

取消选中Adjust Scroll View Insets可以解决您的问题。我在使用故事板时也遇到过这个问题。

答案 9 :(得分:0)

看起来你正试图调整ViewController中的tableView,如果是这样的情况你可以通过在tableView对象上添加空视图并在storyboard中的navigationBar下来修复它,并给它这样的约束。

storyBoard

我知道这是一种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。所以你需要做两件事。

  1. 使用

    隐藏navigationBar

    self.navigationController.navigationBarHidden = YES; //(目标c)  self.navigationController.navigationBarHidden = true; //(swift)

  2. 通过将其origin.y从0更改为-44(因为navigationBar的高度为44)来调整tableview的框架,如下所示, enter image description here

答案 11 :(得分:0)

我只是将self.extendedLayoutIncludesOpaqueBars设为真正解决了我的问题。

答案 12 :(得分:0)

我在UIViewController中附加了UISearchBar时也遇到了同样的问题,搜索栏下方是一个UICollectionView,因此该错误报告是,如果我向下滚动列表(UICollectionView),则默认情况下OS将自动调整scrollview 。

通常可以在viewDidLoad或viewWillAppear下的视图设置功能中禁用这种行为:

$_GET['id'];

参考: