versiones tutorial plataforma objective example ios objective-c

ios - tutorial - objective c vs swift



UITableView-desplácese hasta la parte superior (30)

Añadiendo a lo que ya se ha dicho, puede crear una extensión (Swift) o una categoría (Objetivo C) para hacer esto más fácil en el futuro:

Rápido:

extension UITableView { func scrollToTop(animated: Bool) { setContentOffset(CGPointZero, animated: animated) } }

En cualquier momento que desee desplazar cualquier tableView dado a la parte superior, puede llamar al siguiente código:

tableView.scrollToTop(animated: true)

En mi vista de tabla tengo que desplazarme a la parte superior. Pero no puedo garantizar que el primer objeto sea la sección 0, fila 0. Puede ser que mi vista de tabla comience desde la sección número 5.

Entonces obtengo una excepción, cuando llamo:

[mainTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];

¿Hay otra forma de desplazarse hasta la parte superior de la vista de tabla?


Aquí está el código para ScrollTableView to Top programically

Rápido:

self.TableView.setContentOffset(CGPointMake(0, 1), animated:true)


Como mi tableView está lleno de todo tipo de inserciones, esto fue lo único que funcionó bien:

Swift 3

if tableView.numberOfSections > 0 && tableView.numberOfRows(inSection: 0) > 0 { tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) }

Swift 2

if tableView.numberOfSections > 0 && tableView.numberOfRowsInSection(0) > 0 { tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0), atScrollPosition: .Top, animated: true) }


Con Swift:

self.scripSearchView.quickListTbl?.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)


En Swift-3:

self.tableView.setContentOffset(CGPoint.zero, animated: true)


En iOS 11, usa el contenido de contenido adjustedContentInset para desplazarse correctamente hacia arriba en ambos casos cuando la barra de estado de la llamada está visible o no.

if (@available(iOS 11.0, *)) { [tableView setContentOffset:CGPointMake(0, -tableView.adjustedContentInset.top) animated:YES]; } else { [tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:YES]; }

Rápido:

if #available(iOS 11.0, *) { tableView.setContentOffset(CGPoint(x: 0, y: -tableView.adjustedContentInset.top), animated: true) } else { tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true) }


Es mejor no usar NSIndexPath (tabla vacía), ni asumir que el punto superior es CGPointZero (inserciones de contenido), eso es lo que uso -

[tableView setContentOffset:CGPointMake(0.0f, -tableView.contentInset.top) animated:YES];

Espero que esto ayude.


Este código le permite desplazarse a una sección específica hacia arriba

CGRect cellRect = [tableinstance rectForSection:section]; CGPoint origin = [tableinstacne convertPoint:cellRect.origin fromView:<tableistance>]; [tableinstance setContentOffset:CGPointMake(0, origin.y)];


Este fue el único fragmento de código que funcionó para mí

Swift 4:

tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true) tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) tableView.setContentOffset(CGPoint(x: 0, y: -70), animated: true)

PS 70 es la altura de mi celda de vista de encabezado y tabla


Esto es lo que uso para trabajar correctamente en iOS 11:

extension UIScrollView { func scrollToTop(animated: Bool) { var offset = contentOffset if #available(iOS 11, *) { offset.y = -adjustedContentInset.top } else { offset.y = -contentInset.top } setContentOffset(offset, animated: animated) } }


He encontrado un problema al intentar probar algunos de los métodos en un tableView vacío. Aquí hay otra opción para Swift 4 que maneja vistas de tabla vacías.

extension UITableView { func hasRowAtIndexPath(indexPath: IndexPath) -> Bool { return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section) } func scrollToTop() { let indexPath = IndexPath(row: 0, section: 0) if self.hasRowAtIndexPath(indexPath: indexPath) { self.scrollToRow(at: indexPath, at: .top, animated: true) } } }

Uso:

// from yourViewController or yourTableViewController tableView.scrollToTop()


Para las tablas que tienen un contentInset , la configuración del desplazamiento del contenido a CGPointZero no funcionará. Se desplazará a la parte superior del contenido y a la parte superior de la tabla.

Teniendo en cuenta la inserción de contenido produce esto en su lugar:

[tableView setContentOffset:CGPointMake(0, -tableView.contentInset.top) animated:NO];


Para tener una terminación cuando termine, agregue esta extensión

// MARK: - UIScrollView extension UIScrollView { /// Animate scroll to top with completion /// /// - Parameters: /// - duration: TimeInterval /// - completion: Completion block func animateScrollToTop(withDuration duration: TimeInterval, completion: @escaping (()->())) { UIView.animate(withDuration: duration, animations: { [weak self] in self?.setContentOffset(CGPoint.zero, animated: false) }, completion: { finish in guard finish else { return } completion() }) } } tableView.animateScrollToTop(withDuration: 0.25) { // Finish }


Prefiero lo siguiente, ya que tiene en cuenta un recuadro. Si no hay una inserción, aún se desplazará hacia la parte superior ya que la inserción será 0.

tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true)


Rápido:

tableView.setContentOffset(CGPointZero, animated: true)


Si desea mover la animación de desplazamiento en la tabla, use este código. El desplazamiento se desplaza hacia arriba con animación en 0,5 segundos.

[UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; [_tableContent scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; [UIView commitAnimations];


Swift 3

tableView.setContentOffset(CGPoint.zero, animated: true)

si tableView.setContentOffset no funciona.

Utilizar:

tableView.beginUpdates() tableView.setContentOffset(CGPoint.zero, animated: true) tableView.endUpdates()


Swift:

Si no tienes el encabezado de tableView:

tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true)

si es así :

tableView.setContentOffset(CGPointMake(0, -tableViewheader.frame.height + UIApplication.sharedApplication().statusBarFrame.height ), animated: true)


Tuve que sumar la multiplicación por -1 * a la suma de la barra de estado y la barra de navegación, porque estaba saliendo a esa altura de la pantalla,

self.tableView.setContentOffset(CGPointMake(0 , -1 * (self.navigationController!.navigationBar.height + UIApplication.sharedApplication().statusBarFrame.height) ), animated:true)


UITableView es una subclase de UIScrollView, por lo que también puede utilizar:

[mainTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

O

[mainTableView setContentOffset:CGPointZero animated:YES];

Y en Swift:

mainTableView.setContentOffset(CGPointZero, animated:true)

Y en Swift 3 y arriba:

mainTableView.setContentOffset(.zero, animated: true)


Usar contentOffset no es la manera correcta. Esto sería mejor ya que es la forma natural de la vista de tabla.

tableView.scrollToRow(at: NSIndexPath.init(row: 0, section: 0) as IndexPath, at: .top, animated: true)


Use este código para la implementación de UITableview en swift:

var cell = tableView.dequeueReusableCellWithIdentifier(“cell”) if cell == nil { cell = UITableViewCell(style: .Value1, reuseIdentifier: “cell”) }


Uso tabBarController y tengo algunas secciones en mi vista de tabla en cada pestaña, así que esta es la mejor solución para mí.

extension UITableView { func scrollToTop(){ for index in 0...numberOfSections - 1 { if numberOfSections > 0 && numberOfRows(inSection: index) > 0 { scrollToRow(at: IndexPath(row: 0, section: index), at: .top, animated: true) break } if index == numberOfSections - 1 { setContentOffset(.zero, animated: true) break } } } }


en veloz

su fila = selectioncellRowNumber su sección si tiene = selectionNumber si no tiene configurado es cero

//UITableViewScrollPosition.Middle o Bottom or Top

var lastIndex = NSIndexPath(forRow: selectioncellRowNumber, inSection: selectionNumber) self.tableView.scrollToRowAtIndexPath(lastIndex, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)


yo prefiero

[mainTableView setContentOffset:CGPointZero animated:YES];

Si tiene un recuadro superior en la vista de tabla, debe restarlo:

[mainTableView setContentOffset:CGPointMake(0.0f, -mainTableView.contentInset.top) animated:YES];


NO UTILICE

tableView.setContentOffset(.zero, animated: true)

A veces puede establecer el desplazamiento incorrectamente. Por ejemplo, en mi caso, la celda estaba ligeramente por encima de la vista con inserciones de área segura. No está bien.

Uso intensivo

tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true)


Posibles acciones:

1

func scrollToFirstRow() { let indexPath = NSIndexPath(forRow: 0, inSection: 0) self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true) }

2

func scrollToLastRow() { let indexPath = NSIndexPath(forRow: objects.count - 1, inSection: 0) self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Bottom, animated: true) }

3

func scrollToSelectedRow() { let selectedRows = self.tableView.indexPathsForSelectedRows if let selectedRow = selectedRows?[0] as? NSIndexPath { self.tableView.scrollToRowAtIndexPath(selectedRow, atScrollPosition: .Middle, animated: true) } }

4

func scrollToHeader() { self.tableView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: true) }

5

func scrollToTop(){ self.tableView.setContentOffset(CGPointMake(0, UIApplication.sharedApplication().statusBarFrame.height ), animated: true) }

Deshabilitar Desplazarse hacia arriba:

func disableScrollsToTopPropertyOnAllSubviewsOf(view: UIView) { for subview in view.subviews { if let scrollView = subview as? UIScrollView { (scrollView as UIScrollView).scrollsToTop = false } self.disableScrollsToTopPropertyOnAllSubviewsOf(subview as UIView) } }

Modifiqúelo y utilícelo según el requisito.

Swift 4

func scrollToFirstRow() { let indexPath = IndexPath(row: 0, section: 0) self.tableView.scrollToRow(at: indexPath, at: .top, animated: true) }


Swift 4 a través de la extensión, maneja la vista de tabla vacía:

extension UITableView { func scrollToTop(animated: Bool) { self.setContentOffset(CGPoint.zero, animated: animated); } }


Swift 4 :

Esto funciona muy bien:

//self.tableView.reloadData() if you want to use this line remember to put it before let indexPath = IndexPath(row: 0, section: 0) self.tableView.scrollToRow(at: indexPath, at: .top, animated: true)


func scrollToTop() { NSIndexPath *topItem = [NSIndexPath indexPathForItem:0 inSection:0]; [tableView scrollToRowAtIndexPath:topItem atScrollPosition:UITableViewScrollPositionTop animated:YES]; }

llame a esta función donde quiera que desee UITableView desplazarse hacia arriba