Cómo llamar a Popover Controlador de UITableViewCell.accessoryView?
-
26-09-2019 - |
Pregunta
En primer lugar me gustaría decir que estoy realmente nuevo al ipad desarrollo / iPod / iPhone, y para Objective-C también.
Con eso se dice, estoy tratando de desarrollar una pequeña aplicación dirigida al iPad, usando Xcode y IB, básicamente, tengo una tabla, para cada UITableViewCell en la tabla, he añadido a la accessoryView un botón que contiene una imagen.
Este es el código:
UIImage *img = [UIImage imageNamed:@"myimage.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect frame = CGRectMake(0.0, 0.0, img.size.width, img.size.height);
button.frame = frame; // match the button's size with the image size
[button setBackgroundImage:img forState:UIControlStateNormal];
// set the button's target to this table view controller so we can interpret touch events and map that to a NSIndexSet
[button addTarget:self action:@selector(checkButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside];
button.backgroundColor = [UIColor clearColor];
cell.accessoryView = button;
Hasta ahora, todo va bien, ahora el problema es que quiero que aparezca un control Popover cuando un usuario pulsa el botón de la accessoryView de una célula.
He intentado esto en el "accessoryButtonTappedForRowWithIndexPath" de la tableView:
UITableViewCell *cell = [myTable cellForRowAtIndexPath:indexPath];
UIButton *button = (UIButton *)cell.accessoryView;
//customViewController is the controller of the view that I want to be displayed by the PopOver controller
customViewController = [[CustomViewController alloc]init];
popOverController = [[UIPopoverController alloc]
initWithContentViewController: customViewController];
popOverController.popoverContentSize = CGSizeMake(147, 122);
CGRect rect = button.frame;
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
El problema con este código es que muestra la Popover en la parte superior de la vista de aplicación, durante la depuración vi los valores de "rect" y son:
x = 267
y = 13
así que creo que es bastante obvio por qué la Popover se está mostrando tan arriba en la vista, por lo que mi pregunta es, ¿cómo puedo obtener los valores correctos para la Popover que aparecen justo debajo del botón de la accessoryView de la célula?
Además, como se puede ver, estoy diciéndole que la utilice el "cell.accessoryView" para el "inView:"? Atributo, es que está bien
Solución
Trate de usar button.bounds
en lugar de button.frame
ya que el rect es relativa a la inView
.
Tenga en cuenta también que si la célula está cerca de la parte inferior de la pantalla, el popover no aparezca en el tamaño adecuado, ya que están obligando a la flecha en la dirección hacia arriba. O se debe manejar de forma manual o simplemente utilizar Any.
Otros consejos
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
Cambio de inView: cell.accessoryView a inView: célula
aquí está para SWIFT:
let cell = tableView.cellForRowAtIndexPath(indexPath)
let rect = tableView.convertRect(tableView.rectForRowAtIndexPath(indexPath), toView: tableView)
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("loadZone") as! UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(100,200)
popover!.sourceView = tableView
popover!.sourceRect = rect
self.presentViewController(nav, animated: true, completion: nil)