2014-10-04 3 views
8

Я разработал приложение для iOS7 и теперь пытаюсь обновить его для iOS8. Проблема i имеет следующее:IOS8 как перемещать активный popover

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

В iOS7 я сделал это следующее: Когда экран повернутым я обновленных ограничениями

- (void) updateViewConstraints 
{ 
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) 
    { 
     self.Button.constant = (CGFloat)10; 
    } 
    else 
    { 
     self.Button.constant = (CGFloat)5; 
    } 
    [super updateViewConstraints]; 
} 

Я также переместить поповер

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{ 

    if(TempDisplayPopoverController == examplePopoverController) 
    { 
     [examplePopoverController presentPopoverFromRect:[self ExamplePopoverPosition] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 
} 

Я сначала загрузить поповер

- (void) LoadPopover{ 
    examplePopover = [[examplep alloc] initWithNibName:@"exampleP" bundle:nil]; 
    [examplePopover setDelegate:self]; 
    examplePopoverController = [[UIPopoverController alloc] initWithContentViewController: examplePopover]; 
    [examplePopoverController setDelegate:self]; 

    examplePopoverController.popoverContentSize = examplePopover.view.frame.size; 

    TempDisplayPopoverController = examplePopoverController; 


    if ([examplePopoverController isPopoverVisible]) 
    { 
     [examplePopoverController dismissPopoverAnimated:YES]; 
    } 
    else 
    { 
     [examplePopoverController presentPopoverFromRect:[self ExamplePopoverPosition] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
    } 
} 

[self ExamplePopoverPosition] просто возврат кнопка положение.

Все это прекрасно работало, я был счастлив, iPad был счастлив и все вел себя.

Теперь из-за iOS8 мне нужно изменить несколько бит.

self.interfaceOrientation амортизируется

[examplePopoverController presentPopoverFromRect:[self ExamplePopoverPosition] inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

в didRotateFromInterfaceOrientation выдает ошибку

"Application tried to represent an active popover presentation: <UIPopoverPresentationController: 0x7bf59280>"

Я сумел исправить self.interfaceOrientation по

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [self SetUpScreen:toInterfaceOrientation]; 
} 

- (void) SetUpScreen:(UIInterfaceOrientation)toInterfaceOrientation{ 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
     toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     self.Button.constant = (CGFloat)10; 
    } 
    else 
    { 
     self.Button.constant = (CGFloat)5; 
    } 
    [super updateViewConstraints]; 
} 

, но не знаю, как решить проблему с popover. Я пробовал

popoverController: willRepositionPopoverToRect: inView: 

но просто не может показаться, что он работает.

Может кто-нибудь совет

Благодаря

+0

же проблема здесь. Мы должны спросить Apple ... – giuseppe

+0

привет там, я до сих пор не решил этого <(предоставлено было немного отвлечено чем-то еще) –

+0

Любое обновление по этому вопросу? У меня такая же проблема –

ответ

1

При использовании popoverController:willRepositionPopoverToRect:inView:, при переназначении параметру rect, попробуйте использовать:

*rect = myNewRect; 

и нет:

rect = &presentingRect; 

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

4

В прошивке 8 вы можете использовать -viewWillTransitionToSize:withTransitionCoordinator: обрабатывать размер экрана (и ориентацию) изменения:

- (void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [_popover dismissPopoverAnimated:NO]; 
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     // Update your layout for the new size, if necessary. 
     // Compare size.width and size.height to see if you're in landscape or portrait. 
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
     [_popover presentPopoverFromRect:[self popoverFrame] 
            inView:self.view 
       permittedArrowDirections:UIPopoverArrowDirectionAny 
           animated:NO]; 
    }]; 
} 

При реализации этого метода, то устаревшие методы вращения, как willAnimateRotationToInterfaceOrientation: не будет вызываться при работе на прошивке 8.

-1

Очень интересно - я получил это, чтобы не обновлять позицию вручную. Я не знаю, почему это работает.

let buttonContainer = UIView(frame: CGRectMake(0, 0, 44, 44)) 
let button = UIButton(frame: CGRectMake(0, 0, 44, 44)) 
buttonContainer.addSubview(button) 
view.addSubview(buttonContainer) 

popover!.presentPopoverFromRect(button, inView: button.superview!, permittedArrowDirections: .Any, animated: true) 

Поместите кнопку, представляющую popover изнутри «вид контейнера». Затем popover будет автоматически отрегулируйте местоположение после изменения ориентации.

+0

Попробуйте это решение раньше вниз. Я знаю, это звучит безумно, но это работает для меня. –

0

Во-первых, вам не нужно увольнять и представлять поп-роллер при вращении. UIPopoverPresentationController делает это за вас. Вам даже не нужно обновлять sourceView/sourceRect после их установки при создании popover.

Теперь уловка с animate(alongsideTransition: ((UIViewControllerTransitionCoordinatorContext) -> Void)?, completion: ((UIViewControllerTransitionCoordinatorContext) -> Void)? = nil) заключается в том, что вы должны обновить свои ограничения в alongsideTransition закрытии, а не в completion. Таким образом, вы убедитесь, что UIPopoverPresentationController имеет обновленный sourceRect при восстановлении popover в конце вращения.

Что может показаться противоречащим интуиции, заключается в том, что внутри alongsideTransition у вас уже есть свой новый макет, с которого вы получаете расчет ограничений.

Вот пример в Swift:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 
    coordinator.animate(alongsideTransition: { _ in 
     if self.popover != nil { 
      // optionally scroll to popover source rect, if inside scroll view 
      let rect = ... 
      self.scrollView.scrollRectToVisible(rect, animated: false) 

      // update source rect constraints 
      myConstraint.constant = ... 
      myConstrainedView.setNeedsLayout() 
      myConstrainedView.layoutIfNeeded() 
     } 
    }, completion: nil) 
} 

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

  • Нет связанных вопросов^_^