2012-02-26 3 views
12

Предположим, у меня есть раскадровка, содержащая представление, содержащее кнопку. Когда пользователь нажимает эту кнопку, появляется popover.Есть ли способ программно выбрать программный анкер?

Таким образом, мне нужно установить привязку, перетащив segue на кнопку с помощью Xcode (а затем выполните performSegueWithIdentifier:).

Итак, мой вопрос: есть ли способ установить этот «якорь» программно?

спасибо.

ответ

14

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

Как это решить.

Создайте небольшой снимок в раскадровке (размер не имеет значения), сделать его невидимым и связать его. В моем случае это называется invisibleViewAsArchor

Подключите элемент UIBarbutton к следующему действию.

-(IBAction) showMyPopover:(id)sender { 
    if([self.popoverController isPopoverVisible]) 
    {  
     [self.popoverController dismissPopoverAnimated:YES]; 
    }else{ 
     self.invisibleViewAsArchor.frame = CGRectMake([sender view].frame.origin.x, 
                  [sender view].frame.origin.y-50, 
                  [sender view].frame.size.width, 
                  [sender view].frame.size.height); 

     [self performSegueWithIdentifier:@"segue_to_something" sender:self]; 
    } 
} 

, как вы можете увидеть, прежде чем он показывает поповер (с performSegueWithIdentifier), я меняю кадр в Archor со значениями от кнопки, которая обожженное событие.

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

+0

Привет @GUiLTY, поэтому у меня такая же проблема , Интересно, нужно ли для этого представления «invisibleViewAsArchor» класс, который мне нужен? – gdubs

+0

Привет @gdubs "invisibleViewAsAnchor" стандартный вид и внутри - (ничтожной) viewDidLoad { \t // после кода ... \t self.invisibleViewAsArchor.скрытый = TRUE; } – MiQUEL

+2

Небольшая (крошечная) оптимизация: вам не нужен «возврат» там :) – narco

1

Вы не можете программно создать segue, как описано здесь: Creating a segue programmatically, однако вы можете настроить, какой контроллер назначения вы хотите отображать во время выполнения. Это объясняется в документации на яблоко здесь: Configuring the Destination Controller When a Segue is Triggered.

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

1

У меня была такая же проблема, когда я создавал BarButtonItem программно. Вы также можете обойти его, создав невидимую, отключенную кнопку, которую вы можете установить в качестве привязки в IB.

1

В предложении раскадровки поместите любую произвольную кнопку. Не беспокойтесь о том, какой из них будет переопределен в коде.

В методе контроллера представления prepareForSegue, добавить код:

let dest = segue.destinationViewController 
dest.popoverPresentationController?.barButtonItem = <your bar button here> 

или если вы хотите привязать к виду вместо

dest.popoverPresentationController?.barButtonItem = nil 
dest.popoverPresentationController?.sourceView = <your view here> 
Смежные вопросы