2017-07-05 7 views
-1

NavigationBarとTabBarをプログラムで作成しましたが、コレクションビューをスクロールするときにnavigationBarを非表示にしました。 UICollectionViewController、UICollectionViewDelegateFlowLayout {hide NavigationBarをCollectionViewでスクロールするとき

let cellId = "cellId" 

let productCellId = "productCellId" 
let dealsCellId = "dealsCellId" 


let titles = ["Hello world", "Product", "Deals", "Store world"] 

override func viewDidLoad() { 
    super.viewDidLoad() 


    navigationController?.navigationBar.isTranslucent = false 


    setupNavBarButtons() 

    setupMenuBar() 

    setupCollectionView() 

} 



func setupNavBarButtons() { 









lazy var settingsLauncher: SettingsLauncher = { 
    let launcher = SettingsLauncher() 
    launcher.homeController = self 
    return launcher 
}() 

func targetMyBazar() { 


    let secondViewController = ViewController1() 
    self.navigationController?.pushViewController(secondViewController, animated: true) 

} 

func targetSearch() { 

    let viewController = ViewController4() 
    self.navigationController?.pushViewController(viewController, animated: true) 
} 



func targetUser() { 

    let viewController = ViewController3() 
    self.navigationController?.pushViewController(viewController, animated: true) 
} 

func targetCart() { 

    let viewController = ViewController5() 
    self.navigationController?.pushViewController(viewController, animated: true) 
} 


func handleMore() { 

    settingsLauncher.showSettings() 
} 


func showControllerForSetting(_ setting: Setting) { 
    let dummySettingsViewController = UIViewController() 
    dummySettingsViewController.view.backgroundColor = UIColor.white 
    dummySettingsViewController.navigationItem.title = setting.name.rawValue 
    navigationController?.navigationBar.tintColor = UIColor.white 
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white] 
    navigationController?.pushViewController(dummySettingsViewController, animated: true) 
} 




func scrollToMenuIndex(_ menuIndex: Int) { 
    let indexPath = IndexPath(item: menuIndex, section: 0) 
    collectionView?.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition(), animated: true) 


} 

fileprivate func setTitleForIndex(_ index: Int) { 
    if let titleLabel = navigationItem.titleView as? UILabel { 
     titleLabel.text = " \(titles[index])" 
    } 

} 

lazy var menuBar: MenuBar = { 
    let mb = MenuBar() 
    mb.homeController = self 
    return mb 
}() 

fileprivate func setupMenuBar() { 
    navigationController?.hidesBarsOnSwipe = true 

    let blackView = UIView() 

    blackView.backgroundColor = .lightGray 

    view.addSubview(blackView) 
    view.addConstraintsWithFormat("H:|[v0]|", views: blackView) 
    view.addConstraintsWithFormat("V:[v0(50)]", views: blackView) 

    view.addSubview(menuBar) 
    view.addConstraintsWithFormat("H:|[v0]|", views: menuBar) 
    view.addConstraintsWithFormat("V:[v0(80)]", views: menuBar) 

    menuBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor).isActive = true 
} 




override func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    menuBar.horizontalBarLeftAnchorConstraint?.constant = scrollView.contentOffset.x/4 
} 

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 

    let index = targetContentOffset.pointee.x/view.frame.width 

    let indexPath = IndexPath(item: Int(index), section: 0) 
    menuBar.collectionView.selectItem(at: indexPath, animated: true, scrollPosition: UICollectionViewScrollPosition()) 

    setTitleForIndex(Int(index)) 
} 


func setupCollectionView() { 


    if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout { 
     flowLayout.scrollDirection = .horizontal 
     flowLayout.minimumLineSpacing = 0 
    } 

    collectionView?.backgroundColor = UIColor.blue 

    collectionView?.register(MyBazarCell.self, forCellWithReuseIdentifier: cellId) 


    collectionView?.register(ProductCell.self, forCellWithReuseIdentifier: productCellId) 
    collectionView?.register(DealsCell.self, forCellWithReuseIdentifier: dealsCellId) 

    collectionView?.contentInset = UIEdgeInsetsMake(110, 0, 0, 0) 


    collectionView?.isPagingEnabled = true 
} 

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 4 
} 

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let identifier: String 
    if indexPath.item == 1 { 
     identifier = productCellId 
    } else if indexPath.item == 2 { 
     identifier = dealsCellId 
    } else { 
     identifier = cellId 
    } 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: identifier, for: indexPath) 

    return cell 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize(width: view.frame.width, height: view.frame.height - 50) 
} 

}

インポート財団

インポートのUIKit

:ここでコード インポート財団

インポート財団 インポートのUIKit

クラスHomeMyBazarであります

構造体アイテム{ VAR imagenameの:文字列 VARテキスト:文字列 }

クラスメニューバー:UIViewの、UICollectionViewDataSource、UICollectionViewDelegate、UICollectionViewDelegateFlowLayout {

lazy var collectionView: UICollectionView = { 

    let layout = UICollectionViewFlowLayout() 

    let cv = UICollectionView(frame: .zero, collectionViewLayout: layout) 

    cv.backgroundColor = UIColor.black 
    cv.dataSource = self 
    cv.delegate = self 
    return cv 
}() 





let data: [Item] = [ 
    Item(imageName: "service", text: "Service"), 
    Item(imageName: "product", text: "Product "), 
    Item(imageName: "deals", text: " Deals"), 
    Item(imageName: "store", text: "Store") 
] 


let cellId = "cellId" 
let imageNames = ["service", "product", "deals", "store"] 
let imageTitle = ["Servic", "Product", "Deals", "Store"] 


var homeController: HomeMyBazar? 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    collectionView.register(MenuCell.self, forCellWithReuseIdentifier: cellId) 

    addSubview(collectionView) 
    addConstraintsWithFormat("H:|[v0]|", views: collectionView) 
    addConstraintsWithFormat("V:|[v0]|", views: collectionView) 

    let selectedIndexPath = IndexPath(item: 0, section: 0) 
    collectionView.selectItem(at: selectedIndexPath, animated: false, scrollPosition: UICollectionViewScrollPosition()) 

    setupHorizontalBar() 
} 

var horizontalBarLeftAnchorConstraint: NSLayoutConstraint? 

func setupHorizontalBar() { 
    let horizontalBarView = UIView() 

    horizontalBarView.backgroundColor = UIColor.red 
    horizontalBarView.translatesAutoresizingMaskIntoConstraints = false 
    addSubview(horizontalBarView) 


    horizontalBarLeftAnchorConstraint = horizontalBarView.leftAnchor.constraint(equalTo: self.leftAnchor) 
    horizontalBarLeftAnchorConstraint?.isActive = true 

    horizontalBarView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true 
    horizontalBarView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 1/4).isActive = true 
    horizontalBarView.heightAnchor.constraint(equalToConstant: 4).isActive = true 
} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 



    homeController?.scrollToMenuIndex(indexPath.item) 




} 



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 



    return data.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! MenuCell 



    let item = data[indexPath.item] 
    cell.imageView.image = UIImage(named: item.imageName) 
    cell.imageTitle.text = item.text 

    cell.tintColor = UIColor.white 


    return cell 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return CGSize(width: frame.width/4, height: frame.height) 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 0 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

}

クラスMenuCell:BaseCell {

let imageTitle: UILabel = { 
    let label = UILabel() 
    label.text = "hellow world label" 
    label.textColor = .white 
    return label 
}() 

let imageView: UIImageView = { 
    let iv = UIImageView() 
    iv.image = UIImage(named: "service")?.withRenderingMode(.alwaysTemplate) 

    iv.tintColor = .white 
    return iv 
}() 

override var isHighlighted: Bool { 
    didSet { 

     imageView.tintColor = isHighlighted ? UIColor.white : UIColor.white 
    } 
} 

override var isSelected: Bool { 
    didSet { 

     imageView.tintColor = isSelected ? UIColor.white : UIColor.white 
    } 
} 

override func setupViews() { 
    super.setupViews() 

    addSubview(imageTitle) 
    addSubview(imageView) 

    addConstraintsWithFormat("H:|-25-[v0(80)]|", views: imageTitle) 
    addConstraintsWithFormat("V:|-45-[v0(20)]|", views: imageTitle) 

    addConstraintsWithFormat("H:[v0(28)]", views: imageView) 
    addConstraintsWithFormat("V:|-15-[v0(28)]|", views: imageView) 

    addConstraint(NSLayoutConstraint(item: imageTitle, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)) 
    addConstraint(NSLayoutConstraint(item: imageTitle, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 

    addConstraint(NSLayoutConstraint(item: imageView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0)) 
    addConstraint(NSLayoutConstraint(item: imageView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0)) 
} 

}

Before Scrollin

after scrolling

enter image description here

答えて

1

私はこのコードを記述する必要があり、この

self.navigationController.hidesBarsOnSwipe = true 
+0

を試すことができます。ありがとう –

+0

このコードを** viewwillappear **メソッドに追加することができます –

+0

私はviewWillAppearメソッドをまだ作成していません –

関連する問題