Wie Sie sich richtig präsentieren eine popover von einem UITableViewCell mit UIPopoverArrowDirectionRight oder UIPopoverArrowDirectionLeft

StackOverflow https://stackoverflow.com/questions/3015400

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-

War es hilfreich?

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:

  1. findet benutzerdefinierte accesoryView (cell.accesoryView)
  2. , wenn leer, finden erzeugt accesoryView (UIButton), wenn Zelle
  3. , wenn die UIButton nicht existiert, findet Zelle Contet Ansicht (UITableViewCellContentView)
  4. , 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];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top