UIPopoverController появляется в неправильном месте - PullRequest
7 голосов
/ 08 июля 2011

Так что я потратил некоторое время на поиски ответа на этот вопрос, но пока ничего не нашел.

Я пытаюсь представить всплывающее окно от кнопки на UIInputAccessoryView. UIBarButtonItem, из которого я хочу отобразить всплывающее окно, имеет собственный вид, поэтому я могу использовать изображение. Я создаю кнопку, как это:

 buttonImage=[UIImage imageNamed:@"tags.png"];
 aButton=[UIButton buttonWithType:UIButtonTypeCustom];
 [aButton setImage:buttonImage forState:UIControlStateNormal];
 aButton.frame=CGRectMake(0.0, 0.0, buttonImage.size.width, buttonImage.size.height);
 UIBarButtonItem* compButton2=[[UIBarButtonItem alloc]initWithCustomView:aButton];
 [aButton addTarget:self action:@selector(tagIt:) forControlEvents:UIControlEventTouchUpInside];

Когда приходит время показывать поповер, я делаю это так:

CGRect tRect=[((UIButton*)sender) convertRect:((UIButton*)sender).frame toView:self.notePlainText];
NSLog(@"TagIt tRect: %f %f %f %f", tRect.origin.x, tRect.origin.y, tRect.size.width, tRect.size.height);
[self.popoverController presentPopoverFromRect:tRect inView:self.notePlainText permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

Но то, что я получаю, это:

enter image description here

Всплывающее окно выглядит нормально, но оно появляется над второй кнопкой, когда оно должно появляться над первой.

Итак, я нашел этот вопрос: UIBarButtonItem с пользовательским изображением и без рамки и я подумал: «Ах, возможно, это будет работать лучше, если я представлю поповер из barbuttonitem вместо того, чтобы делать это таким образом. Подклассы кода UIBarButtonItem для того, чтобы иметь кнопку с изображением, а не текстом, и правильно представлять barbuttonitem при вызове действия. Это позволило мне использовать ... presentPopoverFromBarButtonItem ...

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

Popover with wrong orientation

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

Это только в: Скрытие и показ клавиатуры, кажется, делает эту работу немного лучше. Глядя на данные кадра (CGRect) для кнопки, она не меняется между поворотами, если она не скрыта и не возвращена. Это ошибка?

Итак ... мой вопрос заключается в следующем: каков предпочтительный способ представления всплывающего окна из элемента панели кнопок, встроенного в вспомогательный вид пользовательского интерфейса?

Большое спасибо.

Ответы [ 6 ]

8 голосов
/ 09 июля 2011

Так что я заставил это работать со следующим грязным кодом, хотя, если бы кто-то мог сказать мне, почему я должен это делать (или почему я ДОЛЖЕН это делать), я был бы очень признателен.

CGRect r=((UIButton*)sender).frame;
CGRect tRect=[((UIButton*)sender) convertRect:((UIButton*)sender).frame toView:self.view];
tRect.origin.x=r.origin.x;

[self.popoverController presentPopoverFromRect:tRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
5 голосов
/ 05 ноября 2013

У меня была точно такая же проблема, когда поповер указывал на другое место в iOS 7, и благодаря Крису я наконец-то смог увидеть соответствие между iOS 6 и iOS 7. Мне пришлосьсделайте 1 незначительную корректировку кода, заменив frame на bounds, чтобы разместить его там, где я ожидал.

CGRect r = [sender frame];
CGRect tRect = [sender convertRect:sender.bounds toView:self.view];
tRect.origin.x=r.origin.x;

[self.popoverController presentPopoverFromRect:tRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO];
1 голос
/ 05 ноября 2011

Я использовал тот же обходной путь в этом ответе ; это похоже на проблему с iOS 4.3 (может быть 4.x). Кажется, это исправлено в iOS 5.

1 голос
/ 09 июля 2011

Используйте presentPopoverFromBarButtonItem:permittedArrowDirections:animated.Чтобы сделать это, убедитесь, что у вас есть ссылка на кнопку панели (либо сохраняя ее в свойстве на контроллере представления, либо используя IBOutlet), а затем вызовите метод для всплывающего окна, которое вы хотите показать.

0 голосов
/ 20 апреля 2016

Вы можете просто сместить эту точку:

if segue.identifier == "layersPopover"
{
    let vc = segue.destinationViewController
    let controller = vc.popoverPresentationController

    if controller != nil
    {
        controller?.delegate = self

        var rect = controller?.sourceRect
        rect?.offsetInPlace(dx: 19, dy: 0)
        controller?.sourceRect = rect!
    }
}
0 голосов
/ 29 августа 2013

Попробуйте это:

[self.popoverController presentPopoverFromRect:[sender bounds]
                    inView:sender
  permittedArrowDirections:UIPopoverArrowDirectionAny 
                  animated:YES];
...