центрирование uipopover в iPad

Я хочу создать новую клавиатуру для iPad.

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

Все работает нормально.

Теперь - я хочу создать это представление как всплывающее окно.

Основные операции выполнены (всплывает и закрывается)

Но теперь мне нужна помощь в тонкой настройке.

Вот мои вопросы ...

1) Как создать всплывающее окно по центру экрана без выбора UIPopoverArrowDirectionAny?

2) Убедитесь, что всплывающее окно имеет размер, который я создал в файле XIB (в настоящее время он изменяет размер и удаляет часть самого правого размера окна)

Спасибо, Тони


person pithhelmet    schedule 19.11.2010    source источник


Ответы (3)


Чтобы представить его без стрелок, передайте 0 для "allowedArrowDirections":

[popOverController presentPopoverFromRect:rect inView:view permittedArrowDirections:0 animated:YES];

Чтобы центрировать его, проведите прямоугольник 1x1, расположенный в центре вашего обзора:

CGRect rect = CGRectMake(viewWidth/2, viewHeight/2, 1, 1);
[popOverController presentPopoverFromRect:rect inView:view permittedArrowDirections:0 animated:YES];

Затем у вас есть центральное всплывающее окно без стрелок.

Бита об удалении стрелки могла сломаться в любой момент. Они не предоставили опцию UIPopoverArrowDirectionNone по какой-то причине, они могут выбрать в будущем исключение, когда будет передано 0, или значение по умолчанию для чего-то. Используйте его на свой страх и риск.

person George    schedule 22.02.2011
comment
Для iPad в ландшафтном режиме мне пришлось переключить ширину и высоту CGRectMake, чтобы все было правильно центрировано. - person Alan; 03.04.2012
comment
Также работает в iOS 7.0.x. - person Markus Rautopuro; 03.02.2014
comment
Быстро используйте UIPopoverArrowDirection.allZeros, чтобы удалить стрелку - person Jbryson; 17.03.2015

Если вы используете UIPopoverController, у него будет стрелка. Вот ваш выбор.

UIPopoverArrowDirectionAny  
UIPopoverArrowDirectionUp
UIPopoverArrowDirectionDown
UIPopoverArrowDirectionLeft
UIPopoverArrowDirectionRight

Как видите, UIPopoverArrowDirectionNone отсутствует

Что касается размера XIB, в вашем методе ViewDidLoad файла реализации вы можете установить следующее.

self.contentSizeForViewInPopover = CGSizeMake(320.0, 360.0);

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

person jabroni    schedule 13.01.2011
comment
да, но если вы жестко запрограммируете 0, это похоже на UIPopoverArrowDirectionNone - person user2387149; 28.03.2014

Я только что работал над этим, но хотел сделать как можно больше в раскадровке, что немного меняет подход:

1) Выберите всплывающее окно в раскадровке и снимите флажок «Направления вверх / вниз / влево / вправо», чтобы избавиться от стрелок.

Чтобы центрировать его на экране переопределения, подготовьтесь к переходу и сделайте что-то вроде этого:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    UIStoryboardPopoverSegue* popover = (UIStoryboardPopoverSegue*)segue;
    CGFloat horizontalInset = (self.view.frame.size.width - popover.popoverController.popoverContentSize.width) / (CGFloat)2.0;
    CGFloat verticalInset = (self.view.frame.size.height - popover.popoverController.popoverContentSize.height) / (CGFloat)2.0;
    popover.popoverController.popoverLayoutMargins =
        UIEdgeInsetsMake(
            verticalInset,
          horizontalInset,
            verticalInset,
          horizontalInset);
}

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

popover.popoverController.backgroundColor = [UIColor clearColor];

2) В целевом контроллере для перехода найдите атрибут «Popover», отметьте «Use Explicit Size» и укажите размер, который вы хотите, чтобы он отображался в режиме всплывающего окна.

person Oliver Dungey    schedule 14.08.2014