Как правильно представить попуклад от UiableViewcell с UipoPoverarrowDirectionright или UipoPoverarrowDirectionLeft

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

Вопрос

Я всегда пытаюсь представить каповер из клетки внутри таблицы таким образом:

[myPopover presentPopoverFromRect:cell.frame inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

Но я не могу использовать UipoPoverarrowdirectiretright или оставить, потому что, в зависимости от положения iPad (портрет или ландшафт), поповерку кажется в другом месте.

Я представляю Поповер правильно?

PS: Взгляд таблицы находится в деталях SplitView.

Это было полезно?

Решение

Вот простое решение, которое отлично работает для меня

- (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];

}

Другие советы

Вы получаете кадр из клетки через метод retforrowatindexpath. Это верно. Однако TableView, скорее всего, подзлознет более крупным видом на iPad, поэтому, когда POPOVER получит координаты, которые он думает, что они на большем виде. Вот почему попувер появляется в неправильном месте.

Пример, CGRCT для ряда составляет (0,40,320,44). Вместо того, чтобы POPOVER, ориентируясь на этот кадр на табличном представлении, вместо этого нацелены на этот кадр на вашем главном представлении.

Я решил эту проблему, преобразовав кадр от относительных координат таблицы к координатам в моем более широком виде.

код:

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];

Надеюсь, что помогает другим искать этот вопрос.

Я сегодня столкнулся с этой проблемой, и я нашел более простое решение.
При создании популяции вам нужно указать вид контента ячейки:

- (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
}

В SWIFT между вышеуказанными ответами это работает для меня на iPad в любой ориентации:

if let popOverPresentationController : UIPopoverPresentationController = myAlertController.popoverPresentationController {

    let cellRect = tableView.rectForRowAtIndexPath(indexPath)

    popOverPresentationController.sourceView                = tableView
    popOverPresentationController.sourceRect                = cellRect
    popOverPresentationController.permittedArrowDirections  = UIPopoverArrowDirection.Any

}

Чтобы поппораться рядом с аксессуаром, вы можете использовать этот код :)

Я использую это для большего количества Расширенное использование:

  1. Находит пользовательский AccesoryView (Cell.accesoryView)
  2. Если пусто, найдите сгенерированный AccesoryView (Uibutton), если ячейка имеет
  3. Если Uibutton не существует, найдите вид сотового соревнования (UiableViewCellContentView)
  4. Если вид ячейки не существует, используйте вид сотейки

Можно использовать для UiabaccesHeet. или UipoPoverController.

Вот мой код:

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];

Проверено в iOS 4.3-5.1.

Лучше всего использовать в качестве пользовательского метода:

-(UIView*)getViewForSheetAndPopUp:(UITableViewCell*)cell;

И код метода:

-(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;
}

Я тоже столкнулся с этой проблемой. Решение для меня было просто изменить ширину прямого возврата CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath :

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]; 

Это создает прямого сосредоточенности внутри клетки. Таким образом, Поповер имеет больше шансов найти хорошее место для того, чтобы позиционировать себя.

Ячейка рама будет что-то вроде 0,0, ширина, размер, я не верю, что у него будет его X и Y относительно таблицы ... Вы хотите использовать - (CGRCT) RuentforruatindexPath: (NSindexPath *) Index Это, это должно вернуть вам правильный кадр для клетки относительно таблицы ... вот ссылка UiableView Ref.

У меня была такая же проблема, вот обходной путь, который я использовал:

  • В моем UiableViewcell я добавил действия (Ibactions, которые я генерирую свои ячейки из NIB) для определенных кнопок клетки.
  • Затем я определил протокол CellaccationDelegate, который подражает моими коммуникациям, к которым у меня была моя кнопка (отправитель) и моя ячейка (Self)
  • Тогда DetailViewController моего STILLViewController реализует этот протокол, преобразуя из клетки к его координатам ...

вот пример кода

В mycustomtableviewcell.m:

   -(IBAction)displaySomeCellRelativePopover:(id)sender{
        //passes the actions to its delegate
        UIButton *button = (UIButton *)sender;
        [cellActionDelegate displaySomeCellRelativePopoverWithInformation:self.info
                                                               fromButton:button 
                                                                 fromCell:self];   
   }

А то, в 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: Конечно, «Действие» не должно быть ибдейским, а кадр от того, где происходит каповер, не должно быть Uibutton - единое UIView было бы хорошо :)

Вот как я делал и работает отлично.

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];

Это также работало для меня:

 //, которые являются абсолютными координатами в текущей выбранной ячейке CGRCT CRECT = [SELP.VIEW Convertrect: [TBVeventsmatch Revelforlowatindexpath: IndexPath] Frofwiew: TBVeventsMatch.ViewForbaselineLayout];

Принятый ответ не может скомпилировать сейчас.

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];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top