Wie Sie sich richtig präsentieren eine popover von einem UITableViewCell mit UIPopoverArrowDirectionRight oder UIPopoverArrowDirectionLeft
-
26-09-2019 - |
Frage
Ich versuche immer, eine popover aus einer Zelle in einem Tableview auf diese Weise präsentieren zu können:
[myPopover presentPopoverFromRect:cell.frame inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
, aber ich kann nicht UIPopoverArrowDirectionRight oder Links verwenden, da, abhängig von der Position der ipad (Hoch- oder Querformat), erscheint der popover woanders.
Bin ich den popover die richtige Art und Weise zu präsentieren?
PS:. Die Tabellenansicht in der Detailansicht eines SPLITVIEW-
Lösung
Hier ist die einfache Lösung, die gut für mich funktioniert
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CGRect rect=CGRectMake(cell.bounds.origin.x+600, cell.bounds.origin.y+10, 50, 30);
[popOverController presentPopoverFromRect:rect inView:cell permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
Andere Tipps
Sie bekommen den Rahmen von der Zelle über die rectForRowAtIndexPath Methode. Das ist richtig. Doch die Tableview ist höchstwahrscheinlich ein Subview einer größeren iPad Ansicht so, wenn die popover bekommt die Koordinaten sie denkt, dass sie in der größeren Ansicht sind. Aus diesem Grunde ist die popover an der falschen Stelle erscheint.
Beispiel, das CGRect für die Zeile ist (0,40,320,44). Anstelle des popover diesen Rahmen auf dem Tableview Targeting zielt es stattdessen diesen Rahmen auf dem Hauptansicht.
Ich löste dieses Problem, indem Sie den Rahmen aus den relativen Koordinaten des Tisches in meiner größeren Ansicht zu Koordinaten umgewandelt werden.
code:
CGRect aFrame = [self.myDetailViewController.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:theRow inSection:1]];
[popoverController presentPopoverFromRect:[self.myDetailViewController.tableView convertRect:aFrame toView:self.view] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
Hope, die anderen Benutzer für dieses Problem hilft.
Ich kam in diesem Problem heute, und ich habe eine einfachere Lösung gefunden.
Wenn die popover instanziieren, müssen Sie die Zelle Inhalt Ansicht angeben:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UIViewController *aViewController = [[UIViewController alloc] init];
// initialize view here
UIPopoverController *popoverController = [[UIPopoverController alloc]
initWithContentViewController:aViewController];
popoverController.popoverContentSize = CGSizeMake(320, 416);
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[popoverController presentPopoverFromRect:cell.bounds inView:cell.contentView
permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[aView release];
// release popover in 'popoverControllerDidDismissPopover:' method
}
In Swift, zwischen den oben genannten Antworten Dies funktioniert für mich auf einem iPad in jeder Ausrichtung:
if let popOverPresentationController : UIPopoverPresentationController = myAlertController.popoverPresentationController {
let cellRect = tableView.rectForRowAtIndexPath(indexPath)
popOverPresentationController.sourceView = tableView
popOverPresentationController.sourceRect = cellRect
popOverPresentationController.permittedArrowDirections = UIPopoverArrowDirection.Any
}
einen popover Um Pop neben dem accesory u diesen Code verwenden:)
Ich benutze dies für mehr erweiterte Nutzung:
- findet benutzerdefinierte accesoryView (cell.accesoryView)
- , wenn leer, finden erzeugt accesoryView (UIButton), wenn Zelle
- , wenn die UIButton nicht existiert, findet Zelle Contet Ansicht (UITableViewCellContentView)
- , wenn die Zelle Contet Ansicht nicht existiert, verwenden Zelle Ansicht
Kann Verwendung für UIActionSheet oder UIPopoverController .
Hier ist mein Code:
UIView *accessoryView = cell.accessoryView; // finds custom accesoryView (cell.accesoryView)
if (accessoryView == nil) {
UIView *cellContentView = nil;
for (UIView *accView in [cell subviews]) {
if ([accView isKindOfClass:[UIButton class]]) {
accessoryView = accView; // find generated accesoryView (UIButton)
break;
} else if ([accView isKindOfClass:NSClassFromString(@"UITableViewCellContentView")]) {
// find generated UITableViewCellContentView
cellContentView = accView;
}
}
// if the UIButton doesn't exists, find cell contet view (UITableViewCellContentView)
if (accessoryView == nil) {
accessoryView = cellContentView;
}
// if the cell contet view doesn't exists, use cell view
if (accessoryView == nil) {
accessoryView = cell;
}
}
[actionSheet showFromRect:accessoryView.bounds inView:accessoryView animated:YES];
Getestet in iOS 4,3-5,1
Best als benutzerdefinierte Methode zu verwenden:
-(UIView*)getViewForSheetAndPopUp:(UITableViewCell*)cell;
Und Methodencode:
-(UIView*)getViewForSheetAndPopUp:(UITableViewCell*)cell {
UIView *accessoryView = cell.accessoryView;
if (accessoryView == nil) {
UIView *cellContentView = nil;
for (UIView *accView in [cell subviews]) {
if ([accView isKindOfClass:[UIButton class]]) {
accessoryView = accView;
break;
} else if ([accView isKindOfClass:NSClassFromString(@"UITableViewCellContentView")]) {
cellContentView = accView;
}
}
if (accessoryView == nil) {
accessoryView = cellContentView;
}
if (accessoryView == nil) {
accessoryView = cell;
}
}
return accessoryView;
}
Ich habe über dieses Problem auch kommen. Eine Lösung war für mich einfach die Breite des durch CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath
zurück rect zu ändern:
CGRect rect = [aTableView rectForRowAtIndexPath:indexPath];
//create a 10 pixel width rect at the center of the cell
rect.origin.x = (rect.size.width - 10.0) / 2.0;
rect.size.width = 10.0;
[self.addExpensePopoverController presentPopoverFromRect:rect inView:aTableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
Dieses eine rect in der Zelle zentriert erstellen. Auf diese Weise, der popover hat mehr Chancen auf findind einen guten Platz auf Position selbst.
Der Zellenrahmen etwas wie 0,0 sein wird, Breite, Größe, ich glaube nicht, dass es seine X und Y relativ zu dem Tableview haben ... Sie verwenden möchten - (CGRect) rectForRowAtIndexPath: (NSIndexPath * ) indexPath dafür, soll dies den richtigen Rahmen für die Zelle in Bezug auf die Tableview zurückzukehren ... hier ist ein Link UITableView ref
hatte ich die gleiche Art von Problem, hier ist die Abhilfe, die ich verwenden:
- in meiner UITableViewCell, ich hinzugefügt Aktionen (IBActions, wie ich meine Zellen aus einer NIB erzeugen) für die Zelle spezifischer Tasten.
- i dann ein CellActionDelegate Protokoll definiert, dass ahmt meine Handlungen Wähler, zu denen ich meine Taste (Sender) und meine Zelle (Selbst-)
- dann die detailViewController meiner splitViewController implementiert dieses Protokoll, aus der Zelle Umwandlung ist auf seine Koordinaten ...
hier ein Beispiel für Code
In MyCustomTableViewCell.m:
-(IBAction)displaySomeCellRelativePopover:(id)sender{
//passes the actions to its delegate
UIButton *button = (UIButton *)sender;
[cellActionDelegate displaySomeCellRelativePopoverWithInformation:self.info
fromButton:button
fromCell:self];
}
und die, in MyDetailViewController.m:
-(void)displaySomeCellRelativePopoverWithInformation:(MyCellInformationClass *)info
fromButton:(UIButton *)button
fromCell:(UIView *)cell{
UIPopoverController * popoverController = nil;
//create your own UIPopoverController the way you want
//Convert your button/view frame
CGRect buttonFrameInDetailView = [self.view convertRect:button.frame fromView:cell];
//present the popoverController
[popoverController presentPopoverFromRect:buttonFrameInDetailView
inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];]
//release objects created...
}
PS: Natürlich ist die ‚Aktion‘ kein IBAction sein muss, und der Rahmen von wo aus die popover stammt keinen UIButton sein - eine einzige UIView wäre gut:)
Dies ist, wie ich tat und arbeitet völlig in Ordnung.
RidersVC *vc = [RidersVC ridersVC];
vc.modalPresentationStyle = UIModalPresentationPopover;
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
UIPopoverPresentationController *popPresenter = [vc popoverPresentationController];
popPresenter.sourceView = vc.view;
popPresenter.barButtonItem= [[UIBarButtonItem alloc] initWithCustomView:button];
popPresenter.backgroundColor = [UIColor colorWithRed:220.0f/255.0f green:227.0f/255.0f blue:237.0f/255.0f alpha:1.0];
[self.parentVC presentViewController:vc animated:YES completion:NULL];
Dies ist auch für mich gearbeitet:
//Which are the ABSOLUTE coordinates in from the current selected cell CGRect frame =[self.view convertRect:[tbvEventsMatch rectForRowAtIndexPath:indexPath] fromView:tbvEventsMatch.viewForBaselineLayout];
Die akzeptierte Antwort kann jetzt nicht kompiliert werden.
CGRect rect =[tableView rectForRowAtIndexPath:indexPath]; //This is how to get the correct position on the tableView
UIPopoverPresentationController *popController = [controller popoverPresentationController];
popController.sourceRect = rect;
popController.permittedArrowDirections = 0; //Here there is no arrow. It is my app's need
popController.delegate = self;
popController.sourceView = self.tableView;
popController.sourceView.backgroundColor = [UIColor yellowColor];