Come chiamare Popover controller da UITableViewCell.accessoryView?
-
26-09-2019 - |
Domanda
Per prima cosa vorrei dire che sono veramente nuovo per ipad sviluppo / ipod / iphone, e Objective-C troppo.
Con questo detto, sto cercando di sviluppare una piccola applicazione mira l'iPad, utilizzando Xcode e IB, in fondo, ho una tabella, per ogni UITableViewCell nella tabella, ho aggiunto al accessoryView un pulsante che contiene un immagine.
Ecco il codice:
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;
Fin qui, tutto bene, ora il problema è che io voglio un controllo Popover a comparire quando un utente tocca il pulsante sul accessoryView di una cella.
Ho provato questo sul "accessoryButtonTappedForRowWithIndexPath" del 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];
Il problema con questo codice è che mostra la Popover nella parte superiore dell'applicazione View, durante il debug ho visto i valori di "rect" e sono:
x = 267
y = 13
quindi penso che è abbastanza evidente il motivo per cui il Popover viene visualizzato in modo sulla vista, quindi la mia domanda è: come posso ottenere i valori corretti per il Popover a comparire appena sotto il pulsante sul accessoryView della cellula?
Inoltre, come potete vedere, sto dicendo che di utilizzare il "cell.accessoryView" per la "INview:" l'attributo, è che va bene
Soluzione
Prova a usare button.bounds
invece di button.frame
poiché il rettangolo è relativo al inView
.
Si noti inoltre che se la cella è vicino al fondo dello schermo, il popover potrebbe non apparire della dimensione giusta, perché si stanno costringendo la freccia nella direzione Up. Si dovrebbe gestire questo sia manualmente o semplicemente usare qualsiasi.
Altri suggerimenti
[popOverController presentPopoverFromRect:rect inView:cell.accessoryView
permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
Modifica INview: cell.accessoryView a INview: cellula
Ecco una rapida:
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)