Хотя я согласен в принципе, что правильный способ справиться с этим свернуть свой собственный поповер, в данном случае это не проблема для более новые версии ОС. Действительно ли я хочу создавать и поддерживать собственную реализацию popover только для поддержки ОС, которая в конечном итоге будет неактуальной? Если вы действительно хотите, рассмотрите некоторые из бесплатных версий с открытым исходным кодом в Интернете.
Лично я исследовал предложенные здесь методы и придумал свои собственные, используя эту страницу в качестве отправной точки (спасибо!). Он работает для обоих сценариев (с навигационной панелью или без нее) и, на мой взгляд, немного безопаснее.
Вместо добавления метода в UIPopoverController я добавил подпрограмму в свой UIPopoverBackgroundView, чтобы искать нарушающие представления, используя маршрут RELATIVE, а не ABSOLUTE. Короче говоря, поскольку код имеет прямую ссылку на UIPopoverBackgroundView (self), он может перемещаться вверх (супервизор), а затем вниз (subviews).
точка зрения деревьев выглядеть в обоих сценариях:
С UINavigationBar: 
Без UINavigationBar: 
Эти две точки зрения, что мы заинтересованы в являются Представления UILayoutView и UIImage, выделенные жирным шрифтом и подчеркнутые в каждом графике. Мы можем получить ссылку на них, начиная с UIPopoverBackgroundView, используя следующий код (предполагает ARC). Я выполняю это с layoutSubviews
в моей реализации UIPopoverBackgroundView.
// Helper method for traversing child views based solely on class types
UIView* (^__unsafe_unretained __block traverseSubviews)(UIView*, NSArray*) = ^(UIView *root, NSArray* nodeTypes) {
NSString *typeName = [nodeTypes objectAtIndex:0];
for (UIView *subView in root.subviews) {
if ([NSStringFromClass([subView class]) isEqualToString: typeName]) {
if (nodeTypes.count == 1)
return subView;
else
return traverseSubviews(subView, [nodeTypes subarrayWithRange:NSMakeRange(1, nodeTypes.count - 1)]);
}
}
return (UIView*)nil;
};
// Find the subviews of interest, taking into account there could be a navigation bar
UIView *layoutView = traverseSubviews([self superview], @[@"UIView", @"UILayoutContainerView"]);
if (traverseSubviews(layoutView, @[@"UINavigationBar"])) {
layoutView = traverseSubviews(layoutView, @[@"UILayoutContainerView"]);
}
UIView *imageView = traverseSubviews(layoutView, @[@"UIImageView"]);
// Remove the default content appearance
layoutView.layer.cornerRadius = 0;
[imageView removeFromSuperview];
Здесь я использую блок для прохождения обходных объектов, чтобы код был кратким. Он принимает представление как отправную точку и массив имен классов. Массив классных имен - это последовательность классов классов, которые я ожидаю, когда индекс 0 является родительским индексом 1, а индекс 1 является родительским элементом индекса 2 и т. Д. Он возвращает представление, представленное последним элементом массива.
Посмотрите ответ kajham, поскольку iOS 6 должен быть принятым ответом. –