Для alertController: что такое sourceView выбранного сегмента в UISegmentedControl - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть UISegmentedControl с 4 сегментами. Некоторые из этих сегментов создают экземпляр UIAlertController при выборе пользователем.

На UIAlertController вы можете установить popoverPresentationController?.sourceView, чтобы позволить контроллеру предупреждений указывать на исходное изображение, которое будет использоваться на более крупных устройствах, таких как iPad.

Я пытаюсь передать UISegmentedControl, который работает, но якорь всегда находится в верхнем левом углу сегментированного элемента управления, а не в выбранном сегменте.

Я бы хотел использовать фактический сегмент UISegmentedControl в качестве sourceView, но в UISegmentedControl нет массива, содержащего сегменты.

Существует свойство subviews, которое содержит массив представлений. Число соответствует количеству сегментов, поэтому я нашел свое решение. Но если я назначу:

alertController.popoverPresentationController?.sourceView = segmentedControl.subviews[2]

... для 3-го сегмента иногда это работает, а иногда нет. Похоже, этот массив не всегда имеет порядок сегментов на экране.

Как мне найти правильное подпредставление для использования?

1 Ответ

0 голосов
/ 07 ноября 2018

Я нашел решение:

alertController.popoverPresentationController?.sourceView = (segmentedControl.subviews.sorted { $0.frame.origin.x < $1.frame.origin.x })[segmentedControl.selectedSegmentIndex]

Сначала будут отсортированы виды в порядке их координаты x. Тогда я могу использовать segmentedControl.selectedSegmentIndex в качестве индекса.

...