por - Cómo poner botones sobre UITableView que no se desplazará con la tabla en iOS
como usar control por boton iphone 6 (9)
Acabo de ver WWDC 2011 TableView, consejos y trucos videos. Las vistas flotantes son exactamente lo mismo. Todo lo que tienes que hacer es cambiar el marco a la posición original en scrollViewDidScroll.
https://developer.apple.com/videos/wwdc/2011/
Ver videos Consejos y trucos de TableViews.
Quiero poner botones sobre UITableView
que permanece en la misma posición de pantalla, no se desplazará con UITableView
. Cuando traté de addSubview
botones de addSubview
, se muestran pero se desplazan con UITableView
.
La razón para colocar botones sobre UITableView
es permitir que el usuario opere alguna acción en él. No estoy hablando de tener botones en la celda. Son botones flotantes que nunca mueven su posición.
Estoy usando UITableViewController
, y no quiero usar encabezado o pie de página para este propósito. Y también otro bar ( UIToolbar
por ejemplo) no es una opción para mí.
Gracias por adelantado.
En caso de que esté usando un controlador de navegación, puede agregarle la vista:
[self.navigationController.view addSubview:yourView];
Ejemplo:
UIButton *goToTopButton = [UIButton buttonWithType:UIButtonTypeCustom];
goToTopButton.frame = CGRectMake(130, 70, 60, 20);
[goToTopButton setTitle:@"Scroll to top" forState:UIControlStateNormal];
[goToTopButton addTarget:self action:@selector(goToTop) forControlEvents:UIControlEventTouchUpInside];
[goToTopButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[goToTopButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];
goToTopButton.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:13];
[self.navigationController.view goToTopButton];
Para rápido:
override func scrollViewDidScroll(scrollView: UIScrollView){
var frame: CGRect = self.floatingView.frame
frame.origin.y = scrollView.contentOffset.y
floatingView.frame = frame
view.bringSubviewToFront(floatingView)
}
Esta función se invoca cada vez que se desplaza. Luego, dentro de ti, obtienes el marco de tu UIView y actualizas su posición, dependiendo de cuánto recorraste. Tu UIView se mueve constantemente con tu UIScrollView, por lo que para el usuario parece flotar.
Si desea mostrar una vista de control estático que cubre una vista de tabla, tiene tres opciones:
1) No use UITableViewController. En su lugar, cree un UIViewController con una subvista UITableView y coloque su código delegado / fuente de datos de Table View en el UIViewController. Esta opción puede funcionar o no según la arquitectura de su aplicación. Por ejemplo, si intenta implementar una subclase UITableViewController con mucha lógica personalizada, esto no es ideal.
2) El método WWDC 2011. Consulte la sesión 125 de WWDC 2011 "Cambios, sugerencias y trucos de UITableView" a partir de las 32:20. Este método de ajustar la ubicación de la vista cada vez que la vista de tabla se desplaza fue recomendado por Apple antes de que AutoLayout se introdujera en iOS y antes teníamos que lidiar con tantos tamaños de pantalla diferentes. No lo recomiendo, ya que usted mismo administrará las posiciones para todos los diferentes tamaños de pantalla.
3) Recomiendo usar un UIViewController con una vista de contenedor que contendrá su UITableViewController. De esta manera, puede mantener la lógica de vista de tabla separada en UITableViewController. UIViewController aloja un contenedor "tonto" para UITableViewController y también contiene la vista de control estática. Para hacer esto, arrastre un UIViewController a su guión gráfico y arrastre una "Vista de contenedor" dentro de él. Elimine el UIViewController que viene adjunto automáticamente a la vista del contenedor y luego conecte su controlador de vista de tabla para que se muestre en la vista del contenedor arrastrando desde la vista de contrainer al control de vista de tabla y seleccionando "embeber". Ahora, puede agregar controles estáticos como subvistas al UIViewController que se mostrará en la parte superior de la vista de tabla. Se verá algo como esto:
Prefiero este método porque UIViewController puede manejar la lógica de control y UITableViewController maneja la lógica de vista de tabla. Algunas otras respuestas aquí recomiendan agregar el control estático como una subvista a un Controlador de Navegación o Ventana. Estos solo funcionan siempre que nunca agregue otro controlador de vista al controlador de navegación o ventana.
También puedes hacerlo con UITableViewController
(no necesitas UIViewController
ordinario, que anida tu tabla o VC)
Al desplazarse por la tabla, debe ajustar la posición de la vista "flotante" y estará bien
Si está en un UITableViewController, solo
Si desea flotar la vista en la parte superior de UITableView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect frame = self.floatingView.frame;
frame.origin.y = scrollView.contentOffset.y;
self.floatingView.frame = frame;
[self.view bringSubviewToFront:self.floatingView];
}
Si desea flotar la vista en la parte inferior de la UITableView
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGRect frame = self.floatingView.frame;
frame.origin.y = scrollView.contentOffset.y + self.tableView.frame.size.height - self.floatingView.frame.size.height;
self.floatingView.frame = frame;
[self.view bringSubviewToFront:self.floatingView];
}
Creo que esa es la verdadera respuesta a tu pregunta
Una solución para esto es extender UIViewController
lugar de UITableViewController
. Deberá agregar su propia vista de tabla y configurar todo. Luego puede agregar los botones a la vista del controlador de vista en lugar de a la vista de tabla.
hay una mejor solución para esto. puede hacerlo desactivando la propiedad Diseño automático (button.translatesAutoresizingMaskIntoConstraints = false) del Button
correspondiente o cualquier UIView
para botón flotante:
Swift 4
//create a button or any UIView and add to subview
let button=UIButton.init(type: .system)
button.setTitle("NEXT", for: .normal)
let button.frame.size = CGSize(width: 100, height: 50)
self.view.addSubview(nextButton)
//set constrains
button.translatesAutoresizingMaskIntoConstraints = false
if #available(iOS 11.0, *) {
button.rightAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
button.bottomAnchor.constraint(equalTo: tableView.safeAreaLayoutGuide.bottomAnchor, constant: -10).isActive = true
} else {
button.rightAnchor.constraint(equalTo: tableView.layoutMarginsGuide.rightAnchor, constant: 0).isActive = true
button.bottomAnchor.constraint(equalTo: tableView.layoutMarginsGuide.bottomAnchor, constant: -10).isActive = true
}
puede agregar botones en UIWindow sin necesidad de extenderlo a UIViewController en lugar de UITableviewController. Solo agregue botones en la ventana.
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIButton *btn =[UIButton buttonWithType:UIButtonTypeCustom];
[btn setFrame:CGRectMake(60, 200,40, 60)];
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:btn];
Creé una biblioteca para que sea más fácil agregar un botón flotante sobre una UITableView / UICollectionView / UIScrollView . Se llama MEVFloatingButton .
Estos son los pasos para usarlo.
1- Importar archivo de categoría
#import "UIScrollView+FloatingButton.h"
2 - Agregue el delegado y los métodos delegados opcionales.
@interface ViewController () <MEVFloatingButtonDelegate>
#pragma mark - MEScrollToTopDelegate Methods
- (void)floatingButton:(UIScrollView *)scrollView didTapButton:(UIButton *)button;
2 - Crea un MEVFloatingButtonobject.
MEVFloatingButton *button = [[MEVFloatingButton alloc] init];
button.animationType = MEVFloatingButtonAnimationFromBottom;
button.displayMode = MEVFloatingButtonDisplayModeWhenScrolling;
button.position = MEVFloatingButtonPositionBottomCenter;
button.image = [UIImage imageNamed:@"Icon0"];
button.imageColor = [UIColor groupTableViewBackgroundColor];
button.backgroundColor = [UIColor darkGrayColor];
button.outlineColor = [UIColor darkGrayColor];
button.outlineWidth = 0.0f;
button.imagePadding = 20.0f;
button.horizontalOffset = 20.0f;
button.verticalOffset = -30.0f;
button.rounded = YES;
button.hideWhenScrollToTop = YES;
4 - Asignado el botón y delegado a UITableView.
[self.tableView setFloatingButtonView:button];
[self.tableView setFloatingButtonDelegate:self]
Resultados demo