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

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

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

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

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

У меня основные операции завершены (всплывает и увольняется)

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

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

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

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

Спасибо
Tony

Ответ 1

Чтобы представить его без стрелок, перейдите 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 или по умолчанию что-то делать. Используйте его на свой страх и риск.

Ответ 2

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

UIPopoverArrowDirectionAny  
UIPopoverArrowDirectionUp
UIPopoverArrowDirectionDown
UIPopoverArrowDirectionLeft
UIPopoverArrowDirectionRight

Как вы видите, нет UIPopoverArrowDirectionNone

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

self.contentSizeForViewInPopover = CGSizeMake(320.0, 360.0);

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

Ответ 3

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

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

Чтобы сосредоточить его на переопределении экрана, подготовьтесь к segue и выполните что-то вроде этого:

- (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);
}

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

popover.popoverController.backgroundColor = [UIColor clearColor];

2) В контроллере назначения для segue найдите атрибут "Popover" и отметьте "Использовать явный размер" и поместите размер, который вы хотите, чтобы он отображался в режиме popover.