Установить размер UIPopOverController

У меня view с кучей кнопок в UIScrollView. Когда пользователь нажимает кнопку, я хочу, чтобы отображался UIPopOverController, указывающий на выбранную кнопку. Это вроде работает, но всплывающее окно имеет неправильный размер и указывает на случайную точку в представлении. Вот мой код.

-(void)detail:(id)sender{
    UIButton *button = sender;
    NSLog(@"tag = %i", button.tag);

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController];
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    self.popover = [[UIPopoverController alloc] initWithContentViewController:navController];
    self.popover.delegate = self;
    [self.popover presentPopoverFromRect:button.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

Чем проблема с размером всплывающего окна: в представлении, которое находится внутри всплывающего окна, у меня есть:

self.contentSizeForViewInPopover = scroll.contentSize;
NSLog(@"%f, %f", scroll.contentSize.height, scroll.contentSize.width);
NSLog(@"showing: %f, %f",  self.contentSizeForViewInPopover.height,  self.contentSizeForViewInPopover.width);

и оба журнала совпадают. Так что я считаю, что все должно работать правильно. Но это не так. Вот скриншот. Дайте мне знать, если вам понадобится еще мой код. Заранее спасибо.

снимок экрана с ошибкой


person Andrew    schedule 21.07.2011    source источник


Ответы (2)


Что касается только размера всплывающего окна: мне удалось сделать это с помощью UILabel с переменной высотой:

UILabel *hinweis;
hinweis.text = @"...";
hinweis.frame = CGRectMake(x,y,width,800);
[hinweis sizeToFit];

И для стрелки: пробовали ли вы другой параметр inView, например self.parentViewController.view?

person ott--    schedule 24.07.2011
comment
Тем временем я научился использовать contentOffset для tableView, он должен быть аналогом scrollView. `CGRect f = [tableView rectForRowAtIndexPath: indexPath]; CGPoint yOffset = [tableView contentOffset]; CGRect frame = CGRectMake (f.origin.x, f.origin.y + 45 - yOffset.y, 200, 40); [self.poc presentPopoverFromRect: frame ... ` - person ott--; 24.07.2011
comment
Кроме того, вам необходимо инициализировать этот UILabel. - person Tony Adams; 15.02.2013

Первое, что я заметил, это то, что вы должны использовать button.frame, а не button.bounds для прямоугольника from. Разница между этими свойствами UIView:

Геометрия вида определяется его рамкой, границами и свойствами центра. Свойство frame определяет начало координат и размеры представления в системе координат его супервизора и обычно используется во время компоновки для настройки размера или положения представления.

Свойство bounds определяет внутренние размеры вида, как оно их видит, и используется почти исключительно в пользовательском коде рисования.

Вы можете установить высоту своего контроллера popover, используя его сообщение setPopoverContentSize:

// so something like this ...
[self.popover setPopoverContentSize:CGSizeMake(320, 460)];
// and to bind the popover to your button 
[self.popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
person RedBlueThing    schedule 21.07.2011
comment
изменение presentPopoverFromRect на frame сделало его немного лучше. Но я думаю, что частично проблема точки связана с тем, что кнопки находятся в UIScrollView, поэтому исходная рамка кнопки больше не является рамкой, когда отображается всплывающее окно. Кроме того, я не могу установить такой фрейм всплывающего окна, потому что я хочу изменить его в зависимости от размера текста внутри всплывающего окна. - person Andrew; 21.07.2011
comment
@JaspreetSingh С удовольствием :) - person RedBlueThing; 01.03.2014