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