ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Если вы вообще заинтересованы в том, чтобы доставить ваше приложение в магазин, этот код почти наверняка является основанием для отклонения.Он погружается в закрытый API UIKit, который является большим нет-нет, поскольку это касается Apple.
@ RunningPink была правильной идеей.В зависимости от того, как настроена иерархия представления, всплывающее окно может копироваться дальше, чем два суперпредставления.Сам поповер это экземпляр (приватного) класса _UIPopover
(по крайней мере в iOS 5).Вы можете найти этот вид, выполнив:
UIView *possiblePopover = popoverController.contentViewController.view;
while (possiblePopover != nil) {
// Climb up the view hierarchy
possiblePopover = possiblePopover.superview;
if ( [NSStringFromClass([possiblePopover class]) isEqualToString:@"_UIPopoverView"] ) {
// We found the popover, break out of the loop
break;
}
}
if (nil != possiblePopover) {
// Do whatever you want with the popover
}
При этом я обнаружил, что преобразование вида часто заканчивалось тем, что поповер выглядел размытым.Я обнаружил, что причина была в том, что супервидение поповера было экземпляром другого частного класса с именем UIDimmingView
, который отвечает за принятие прикосновений за пределами поповера и вызывает его отклонение.Выполнение поворота в режиме затемнения убрало размытие, которое я видел во всплывающем окне.
Однако преобразование затемнения может привести к странностям, когда определенные части окна не «покрываются» видом затемнения, поэтому всплывающее окноне будет уволен, если эти части окна постукивают.Чтобы обойти это, я применил вращение к представлению затемнения, сбросил рамку представления затемнения, чтобы покрыть экран, а затем перевел всплывающее представление на место.
if (nil != possiblePopover) {
// Found the popover view
CGAffineTransform rotation = CGAffineTransformMakeRotation(-M_PI_2);
CGAffineTransform translation = // Whatever translation in necessary here
// Rotate the UIDimming View and reset its frame
[possiblePopover.superview setTransform:rotation];
[possiblePopover.superview setFrame:CGRectMake(0, 0, possiblePopover.superview.frame.size.height, possiblePopover.superview.frame.size.width)];
// Translate the popover view
[possiblePopover setTransform:translation];
}