Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Swift 为什么导航栏会隐藏collectionView?_Swift_Uicollectionview_Uinavigationcontroller_Navbar_Viewcontroller - Fatal编程技术网

Swift 为什么导航栏会隐藏collectionView?

Swift 为什么导航栏会隐藏collectionView?,swift,uicollectionview,uinavigationcontroller,navbar,viewcontroller,Swift,Uicollectionview,Uinavigationcontroller,Navbar,Viewcontroller,使用Swift-5.0.1、iOS-12.2、 我成功地放置了一个UICollectionView,屏幕宽的单元格具有150像素的自定义高度 但是,导航栏隐藏了第一个单元格 我看到了不同的声明,声明contentInset必须应用于collectionView 然而,我发现的帖子中没有一篇明确说明必须用作补偿的数量(特别是考虑到所有新的iPhone屏幕以及导航栏可能大或小的事实) 我试过: let offset1=self.navigationController?.navigationBar.

使用Swift-5.0.1、iOS-12.2、

我成功地放置了一个UICollectionView,屏幕宽的单元格具有150像素的自定义高度

但是,导航栏隐藏了第一个单元格

我看到了不同的声明,声明contentInset必须应用于collectionView

然而,我发现的帖子中没有一篇明确说明必须用作补偿的数量(特别是考虑到所有新的iPhone屏幕以及导航栏可能大或小的事实)

我试过:

let offset1=self.navigationController?.navigationBar.frame.size.height
let offset2=navigationController?.navigationBar.frame.maxY
self.edgesForExtendedLayout=[]
self.collectionView.contentInset=UIedgeInSet(顶部:偏移量2,左侧:0,底部:0,右侧:0)
但是没有一个值真正匹配所需的插图

我的问题:为了在collectionView上正确设置contentInset,是否可以依赖navigationController(或其他)的height属性??

我意识到对于iPhone XS,正确的插入大约是112像素。这些是如何形成的

下图说明了collectionView第一个单元格的导航栏隐藏

My NavigationController和UICollectionViewController在
AppDelegate.swift中实例化如下:

var窗口:UIWindow?
func应用程序(application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.launchOptions键:任意]?)->Bool{
//应用程序启动后自定义的覆盖点。
window=UIWindow(帧:CGRect(x:0,y:0,宽度:UIScreen.main.bounds.width,高度:UIScreen.main.bounds.height))
设vc=CollectionViewController()
设nc=UINavigationController(rootViewController:vc)
窗口?.rootViewController=nc
窗口?.makeKeyAndVisible()
返回真值
}
这里是CollectionViewController:

导入UIKit
类CollectionViewController:BaseListController、UICollectionViewDelegateFlowLayout{
fileprivate let cellId=“cellId”
fileprivate let activityIndicator=UIActivityIndicatorView()
lazy var viewModel:PhotoListViewModel={
返回PhotoListViewModel()
}()
重写func viewDidLoad(){
super.viewDidLoad()
//初始化静态视图
initView()
//初始视图模型
initVM()
}
func initView(){
self.navigationItem.title=“NavBar”
collectionView.register(PhotoListCollectionViewCell.self,forCellWithReuseIdentifier:cellId)
collectionView.backgroundColor=.white
//112的数字是正确的插入,但为什么???????
collectionView.contentInset=UIEdgeInSet(顶部:112,左侧:0,底部:0,右侧:0)
}
func initVM(){
//原始绑定
viewModel.showAlertClosure={[weak self]()在中
DispatchQueue.main.async{
如果let message=self?.viewModel.alertMessage{
self?.showAlert(消息)
}
}
}
viewModel.updateLoadingStatus={[weak self]()在中
DispatchQueue.main.async{
设isLoading=self?.viewModel.isLoading??false
如果卸载{
self?.activityIndicator.startAnimating()
UIView.animate(持续时间:0.2,动画:{
self?.collectionView.alpha=0.0
})
}否则{
self?.activityIndicator.stopAnimating()
UIView.animate(持续时间:0.2,动画:{
self?.collectionView.alpha=1.0
})
}
}
}
viewModel.reloadTableViewClosure={[weak self]()在中
DispatchQueue.main.async{
self?.collectionView.reloadData()
}
}
viewModel.initFetch()
}
func showAlert(u消息:字符串){
let alert=UIAlertController(标题:“警报”,消息:消息,首选样式:。警报)
addAction(UIAlertAction(标题:“确定”,样式:。取消,处理程序:nil))
self.present(警报、动画:true、完成:nil)
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
}
重写func collectionView(collectionView:UICollectionView,numberOfItemsInSection:Int)->Int{
返回viewModel.numberOfCells
}
重写func collectionView(collectionView:UICollectionView,cellForItemAt indexPath:indexPath)->UICollectionViewCell{
guard let cell=collectionView.dequeueReusableCell(带ReuseIdentifier:cellId,for:indexPath)作为?PhotoListCollectionViewCell-else{
fatalError(“情节提要中不存在单元格”)
}
让cellVM=viewModel.getCellViewModel(at:indexPath)
cell.photoListCellViewModel=cellVM
返回单元
}
func collectionView(collectionView:UICollectionView,布局collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:indexPath)->CGSize{
return.init(宽度:view.frame.width,高度:150)
}
重写func collectionView(collectionView:UICollectionView,didSelectItemAt indexPath:indexPath){
self.viewModel.userPressed(at:indexPath)
如果viewModel.isAllowSegue{
设detailVC=PhotoDetailViewController()
如果let photo=viewModel.selectedPhoto{
detailVC.imageView=UIImageView()
detailVC.imageView.contentMode=.ScaleSpectFill
detailVC.imageView.sd_setImage(带:URL(字符串:photo.image_URL)){(图像,错误,类型,URL)在
}
}
自我导航控制