tutorial objective lenguaje language espaƱol descargar bridging objective-c swift ios8

objective-c - objective - swift lenguaje



hidesBarsOnSwipe nunca vuelve a mostrar la barra de navegaciĆ³n cuando se desplaza hacia arriba (6)

Así que quiero ocultar la barra de navegación cuando se desplaza hacia abajo y volver a traerla cuando se desplaza hacia arriba. Escondiéndolo funciona perfectamente con

self.navigationController?.hidesBarsOnSwipe = true

Pero espero que se muestre de nuevo cuando se desplaza hacia arriba. Hice un proyecto de prueba en el que el controlador de vista solo tiene un UICollectionView que cubre toda la pantalla. Luego, se muestra de nuevo la barra de navegación como se esperaba hasta que agrego esta línea a viewDidLoad (agregando celdas a la vista de colección):

self.collectionView.delegate = self

Y así es como se ve todo el controlador de vista

class ViewController: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate { @IBOutlet var collectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() self.collectionView.dataSource = self self.collectionView.delegate = self self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Test") self.navigationController?.hidesBarsOnSwipe = true } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { return collectionView.dequeueReusableCellWithReuseIdentifier("Test", forIndexPath: indexPath) as UICollectionViewCell } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { return CGSizeMake(300, 300) } }

Entonces, ¿por qué la barra de navegación deja de funcionar cuando agrego celdas a mi vista de colección?


Intenté establecer la propiedad hidesBarsOnSwipe en true en mi clase ViewController en la función ViewDidLoad como se indica a continuación, pero no funcionó para ocultar la barra de navegación al deslizar hacia arriba y mostrar la barra de navegación al deslizar hacia abajo.

class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.navigationController?.hidesBarsOnSwipe = true } }

La configuración de hidesBarsOnSwipe en true solo tendrá efecto si estamos usando el UITableViewController o UICollectionViewController como pantallas principales, hidesBarsOnSwipe no funcionará si hemos agregado un UITableView al UIViewController para mostrar la lista de datos.

Solución

class TestTableViewController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() self.navigationController?.hidesBarsOnSwipe = true } }

Espero que esta respuesta pueda ayudar ...!


Para ampliar la respuesta de Oleg ...

Si está utilizando Interface Builder para establecer una restricción en la vista principal de un controlador de vista, Xcode muestra de manera predeterminada las opciones para establecer la restricción vertical en la guía de diseño superior. Sin embargo, si presiona ''Opción'', verá un conjunto alternativo de restricciones. La restricción para ''Top Space to Container'' es lo que está buscando.


Según comentarios anteriores, esto parece ser un error a partir de iOS 10.3

mientras utiliza una vista de uicollection. Llamo su atención sobre un código que reescribí desde APDynamicHeaderTableViewController https://github.com/aaronpang/APDynamicHeaderTableViewController/issues/4

Está utilizando snapkit https://github.com/SnapKit/SnapKit

(Disculpas a todos los amantes de las restricciones de IB + NSLayout.)

class APDynamicHeaderTableViewController : UIViewController { var largeWideSize = CGSize(width: UIScreen.main.bounds.width , height: 285 ) let headerView = APDynamicHeaderView () // Change your header view here let cellLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() var feedCV:UICollectionView! fileprivate var headerViewHeight:CGFloat = 80 // this will be updated by scrolling fileprivate var headerBeganCollapsed = false fileprivate var collapsedHeaderViewHeight : CGFloat = UIApplication.shared.statusBarFrame.height fileprivate var expandedHeaderViewHeight : CGFloat = 100 fileprivate var headerExpandDelay : CGFloat = 100 fileprivate var tableViewScrollOffsetBeginDraggingY : CGFloat = 0.0 init(collapsedHeaderViewHeight : CGFloat, expandedHeaderViewHeight : CGFloat, headerExpandDelay :CGFloat) { self.collapsedHeaderViewHeight = collapsedHeaderViewHeight self.expandedHeaderViewHeight = expandedHeaderViewHeight self.headerExpandDelay = headerExpandDelay super.init(nibName: nil, bundle: nil) } init () { super.init(nibName: nil, bundle: nil) } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { super.loadView() self.view.backgroundColor = .green // Cell Layout Sizes cellLayout.scrollDirection = .vertical cellLayout.sectionInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) cellLayout.itemSize = CGSize(width: UIScreen.main.bounds.width, height: 185 + 80) // Header view self.view.addSubview(headerView) headerView.snp.remakeConstraints { (make) -> Void in make.top.left.equalToSuperview() make.width.equalToSuperview() make.height.equalTo(headerViewHeight) } // CollectionView feedCV = UICollectionView(frame: .zero, collectionViewLayout: cellLayout) self.view.addSubview(feedCV) self.feedCV.snp.remakeConstraints { (make) -> Void in make.top.equalTo(headerView.snp.bottom) // this is pegged to the header view which is going to grow in height make.left.equalToSuperview() make.width.equalToSuperview() make.bottom.equalToSuperview() } feedCV.backgroundColor = .red feedCV.showsVerticalScrollIndicator = true feedCV.isScrollEnabled = true feedCV.bounces = true feedCV.delegate = self feedCV.dataSource = self // YOUR COLLECTIONVIEW CELL HERE!!!!! feedCV.register(VideoCollectionViewCell.self, forCellWithReuseIdentifier: VideoCollectionViewCell.ID) } // Animate the header view to collapsed or expanded if it is dragged only partially func animateHeaderViewHeight () -> Void { Logger.verbose("animateHeaderViewHeight") var headerViewHeightDestinationConstant : CGFloat = 0.0 if (headerViewHeight < ((expandedHeaderViewHeight - collapsedHeaderViewHeight) / 2.0 + collapsedHeaderViewHeight)) { headerViewHeightDestinationConstant = collapsedHeaderViewHeight } else { headerViewHeightDestinationConstant = expandedHeaderViewHeight } if (headerViewHeight != expandedHeaderViewHeight && headerViewHeight != collapsedHeaderViewHeight) { let animationDuration = 0.25 UIView.animate(withDuration: animationDuration, animations: { () -> Void in self.headerViewHeight = headerViewHeightDestinationConstant let progress = (self.headerViewHeight - self.collapsedHeaderViewHeight) / (self.expandedHeaderViewHeight - self.collapsedHeaderViewHeight) self.headerView.expandToProgress(progress) self.view.layoutIfNeeded() }) } } } extension APDynamicHeaderTableViewController : UICollectionViewDelegate { } extension APDynamicHeaderTableViewController : UIScrollViewDelegate { func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { // Clamp the beginning point to 0 and the max content offset to prevent unintentional resizing when dragging during rubber banding tableViewScrollOffsetBeginDraggingY = min(max(scrollView.contentOffset.y, 0), scrollView.contentSize.height - scrollView.frame.size.height) // Keep track of whether or not the header was collapsed to determine if we can add the delay of expansion headerBeganCollapsed = (headerViewHeight == collapsedHeaderViewHeight) } func scrollViewDidScroll(_ scrollView: UIScrollView) { // Do nothing if the table view is not scrollable if feedCV.contentSize.height < feedCV.bounds.height { return } var contentOffsetY = feedCV.contentOffset.y - tableViewScrollOffsetBeginDraggingY // Add a delay to expanding the header only if the user began scrolling below the allotted amount of space to actually expand the header with no delay (e.g. If it takes 30 pixels to scroll up the scrollview to expand the header then don''t add the delay of the user started scrolling at 10 pixels) if tableViewScrollOffsetBeginDraggingY > ((expandedHeaderViewHeight - collapsedHeaderViewHeight) + headerExpandDelay) && contentOffsetY < 0 && headerBeganCollapsed { contentOffsetY = contentOffsetY + headerExpandDelay } // Calculate how much the header height will change so we can readjust the table view''s content offset so it doesn''t scroll while we change the height of the header let changeInHeaderViewHeight = headerViewHeight - min(max(headerViewHeight - contentOffsetY, collapsedHeaderViewHeight), expandedHeaderViewHeight) headerViewHeight = min(max(headerViewHeight - contentOffsetY, collapsedHeaderViewHeight), expandedHeaderViewHeight) let progress = (headerViewHeight - collapsedHeaderViewHeight) / (expandedHeaderViewHeight - collapsedHeaderViewHeight) // Logger.verbose("headerViewHeight:",headerViewHeight) headerView.expandToProgress(progress) headerView.snp.updateConstraints { (make) -> Void in make.height.equalTo(headerViewHeight) } // When the header view height is changing, freeze the content in the table view if headerViewHeight != collapsedHeaderViewHeight && headerViewHeight != expandedHeaderViewHeight { feedCV.contentOffset = CGPoint(x: 0, y: feedCV.contentOffset.y - changeInHeaderViewHeight) } } // Animate the header view when the user ends dragging or flicks the scroll view func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { animateHeaderViewHeight() } func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { animateHeaderViewHeight() } } extension APDynamicHeaderTableViewController : UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 100 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: VideoCollectionViewCell.ID, for: indexPath) as! VideoCollectionViewCell return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return largeWideSize } }


Tuve el mismo problema pero con una vista web. El problema fue que la restricción superior de la vista web era "Top Layout Guide.Top", luego de cambiar la restricción superior a "Superview.Top", el problema se resolvió.


Tuve el mismo problema. Cuando agregué el código para ocultar la barra de estado junto con la barra de navegación, funcionó.

- (BOOL)prefersStatusBarHidden { return self.navigationController.isNavigationBarHidden; }