проблема с позиционированием pop over view - PullRequest
4 голосов
/ 05 октября 2010

Когда я переключаюсь между книжным и альбомным режимами (и наоборот) на iPad, положение моего поповера искажается. Вот как я вычисляю фрейм моего поповера:

aRect = self.myElement.frame;
aRect.origin.x += aRect.size.width;

[aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];

Пожалуйста, скажите мне, что здесь не так?

Ответы [ 4 ]

5 голосов
/ 05 октября 2010

Из документации UIPopoverController : (выделено мной)

Если пользователь поворачивает устройство во время поповер виден, поповер контроллер скрывает поповер, а затем показывает это снова в конце вращение. Поповер контроллер пытается позиционировать поповер соответственно для вас, но вы можете иметь чтобы представить это снова или скрыть в целом в некоторых случаях. Например, при отображении из элемента кнопки панели, контроллер поповер автоматически регулирует положение (и, возможно, размер) поповера на аккаунт для изменения положения бара пункт кнопки. Однако, если вы удалите элемент кнопки панели во время вращение или , если вы представили поповер из целевого прямоугольника в view , контроллер popover не попытка изменить положение поповера. В те случаи, вы должны вручную скрыть поповер или представить его снова из соответствующая новая должность. Вы можете сделать это в didRotateFromInterfaceOrientation: метод контроллера представления, который вы используется для представления поповера.

1 голос
/ 07 мая 2013

Это старый вопрос, но я вижу, что ОП не понял, что ему делать с предложением Криса Маркела. Это задокументировано в Технических вопросах и ответах QA1694 . Просто представьте поповер снова.

Допустим, вы поместили свой код popover выше в метод с именем showPopover. Просто вызовите этот метод при вращении, сначала убедитесь, что он видим:

-(void)showPopover {
    aRect = self.myElement.frame;
    aRect.origin.x += aRect.size.width;

    [self.aPopOver presentPopoverFromRect:aRect inView:self.myElement.superview permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)oldOrientation
{
    if ([self.aPopover isPopoverVisible]) {
        [self showPopover];
    }
}
1 голос
/ 05 октября 2010

хорошо, я заметил что-то странное в вашем коде.

по какой причине вы добавляете размер ширины в начало позиции x в aRect?aRect.origin.x + = aRect.size.width;

я предполагаю, что вы хотите, чтобы это был верхний правый угол ....

Вы можете раскомментировать код в вашем файле .mи сделайте так:

// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     Return YES; // for supported orientations
    //otherwise return (interfaceOrientation == UIInterfaceOrientationLandscape); if you want only landscape mode.
}

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

(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    [self layoutSubviews];
}

, а также layoutSubviews

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews called");

    ...recalc rects etc based on the new self.view.bounds...
}

Работает так.

PK

0 голосов
/ 27 мая 2019

Используйте указанный ниже метод UIPopoverPresentationControllerDelegate в viewcontroller.

func popoverPresentationController(_ popoverPresentationController: UIPopoverPresentationController,
                                   willRepositionPopoverTo rect: UnsafeMutablePointer<CGRect>,
                                   in view: AutoreleasingUnsafeMutablePointer<UIView>) {
    rect.pointee = self.view.bounds
}
...