Проблема с presentPopoverFromRect: inView: allowArrowDirections: animated заключается в том, что если размер содержимого всплывающего окна больше, чем умещается на экране (например, из-за того, что аннотация расположена близко к краю экрана), система сначала (хотя бы частично) не обращайте внимания на прямоугольник и поместите наконечник стрелки где-то посередине вида. Я решил это, сделав это так:
self.popover = [[UIPopoverController alloc] initWithContentViewController:placeDetailViewController];
[self.popover presentPopoverFromRect:CGRectMake(0, 0, 29, 31) inView:view.rightCalloutAccessoryView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
RightCalloutAccessoryView, как правило, представляет собой кнопку раскрытия сведений, размер которой составляет 29 на 31. Итак, что я делаю, это создаю прямоугольник 29 на 31, который охватывает весь вспомогательный вид. Затем я представляю поповер из вспомогательного вида. При увеличении 29 до 40 стрелка всплывающего окна будет находиться за пределами всплывающей подсказки, но только в том случае, если на экране будет достаточно места для представления всей выноски. Если нет, стрелка будет перемещаться внутри пузыря. Чтобы поддерживать согласованный интерфейс, я оставил ширину в 29 *. 1004 *