2013-09-28 2 views
4

У меня есть UIPopoverController, который я использовал некоторое время. Я обновляю свой код для iOS 7 сейчас, и когда я изменяю размер popover, он внезапно перемещается по экрану, что создает очень плохой пользовательский интерфейс.UIPopoverController перемещается, когда я изменяю его размер

Когда я нахожусь в портретной ориентации, этого не происходит. Я нажимаю, чтобы открыть popover, затем я нажимаю кнопку, которая заставляет popover расширяться, и все в порядке. Однако, если я переключусь на альбомную ориентацию и сделаю то же самое, когда я нажимаю кнопку, чтобы развернуть popover, тогда она переместится в другое место.

Вот видео, показывающее, что я говорю о: https://vimeo.com/75632364

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

- (IBAction) touchedButtonPayDownLoan:(id)sender { 

    UIView *payOffView = nil; 
    if ([self.liability isBankLoan]) { 
     payOffView = self.viewPayoffBank; 
    } else { 
     payOffView = self.viewPayoffOther; 
    } 

    CGRect loanFrame = payOffView.frame; 
    loanFrame.origin.y = self.toolbar.frame.origin.y; 
    payOffView.frame = loanFrame; 
    [self.view addSubview:payOffView]; 
    [self.view bringSubviewToFront:self.toolbar]; 

    [UIView beginAnimations:@"Show Payoff View" context:nil]; 

    NSMutableArray *items = [[self.toolbar items] mutableCopy]; 
    [items removeLastObject]; 
    [items addObject:self.barButtonFinish]; 
    self.toolbar.items = items; 

    // -------- RELEVANT BITS HERE --------- 
    CGRect frame = self.view.frame; 
    frame.size.height += payOffView.frame.size.height; 
    self.view.frame = frame; 
    self.preferredContentSize = frame.size; 
    // -------- RELEVANT BITS HERE --------- 

    [UIView commitAnimations]; 

} 

Я DON» t хотите, чтобы popover переместился на позиции, потому что это будет раздражать пользователя. Есть идеи?

ответ

0

На первый взгляд ваш код выглядит хорошо. Я не использовал beginAnimations:context:, так что я проверил UIView documentation для него, и он включает в себя этот комментарий:

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

Поэтому я рекомендую изменить код, чтобы использовать методы анимации на основе блоков, например. animateWithDuration:animations: и проверьте, не сдвинулся ли ваш popover неожиданно.

1

Когда поповер видна, и вы хотите, чтобы изменить его размер, вы должны использовать:

-[UIPopover setPopoverContentSize:animated:]

Вы не должны изменять frame контроллера непосредственно.

4

У меня возникла аналогичная проблема, и я обнаружил, что движения popover вызваны тем фактом, что менеджер компоновки считает, что popover с новым размером не будет соответствовать последней позиции или будет выглядеть лучше новые один - вы, скорее всего, создание поповера с

permittedArrowDirections = UIPopoverArrowDirectionAny 

что толк в том, что, хотя поповере перемещается в новое положение стрелок не получает перерисовываются.

С моей точки зрения, я решил проблему, явно установив allowArrowDirections на одно значение (UP или DOWN), и размеры не увеличивают мой popover.

Надеюсь, это поможет.

+0

К сожалению, это не идеальное решение, потому что многие приложения (включая мой) должны представлять popover из любого места на экране. – Bek

+0

Затем просто напишите какой-то код, чтобы пересчитать позицию, и выберите направление стрелки в соответствии с положением, просто не позволяйте iOS решить для себя, если вы хотите изменить размер popover позже. –

0

Благодаря ответу по @PeterSarnowski я был в состоянии остановить мой поповер передвигаться в iOS7: (? И, возможно, до сих пор)

[myPopoverController presentPopoverFromRect:view.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; 

Интересно, если это временное решение необходимо потому, что компания Apple рассматривает возможность изменения popover в iOS7:

Но, видимо, документация не является точной в настоящее время. iOS 7 - UIPopoverController : deprecated arrows?

0

Вы должны взглянуть на новый методе popoverController:willRepositionPopoverToRect:inView: для UIPopoverControllerDelegate в прошивке 7. Вы можете отрегулировать положение UIPopover там .

От Apple's documentation:

Для Popovers, которые были представлены с использованием presentPopoverFromRect: INview: permittedArrowDirection s: animated: метод, контроллер popover вызывает этот метод при изменении ориентации интерфейса. Ваш делегат может использовать этот метод для настройки предлагаемой позиции popover.

+0

После нескольких тестов я могу подтвердить, что упомянутый делегат вызывается только во время вращения интерфейса, который отличается от описанного сценария. – Omer

Смежные вопросы