UIPopoverController автоматически изменяет размер до максимальной высоты на pushViewController

У меня есть поповер, содержащий UINavigationController. Я могу отображать поповер хорошо, и он содержит navController просто отлично. NavController содержит tableView, и когда я выбираю элемент, он создает новый подробный вид:

     DeviceDetailViewController *detailViewController = 
[[[DeviceDetailViewController alloc] initWithNibName:@"DeviceDetailViewController" bundle:nil] autorelease];

Затем я запускаю новый контроллер вида:

    [self.navigationController pushViewController:detailViewController animated:YES];

Это происходит, когда возникает проблема: после нажатия нового представления, поповер изменяет размер до максимальной высоты, доступной на iPad.

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

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

Я подумал, что это может быть метод грубой силы, чтобы контролировать размер. Как ни странно, однако, это на самом деле вызывает некоторые быстрые графические причуды (как будто представление было недавно анимировано), сопровождаемое продолжением изменения размера, как описано выше.

Другими словами, что-то буквально заставляет popover достигать максимальной высоты, и, похоже, это происходит после всех методов делегата, которые были вызваны.

Это навигационный контроллер? Кто-нибудь видел такие вещи?

68 голосов | спросил SG1 11 PM00000050000000231 2010, 17:25:02

12 ответов


0

Это исправило это после того, как у меня возникла та же проблема (по совпадению и сегодня):

РЕДАКТИРОВАТЬ . Поскольку contentSizeForViewInPopover устарела в iOS7.0, поэтому используйте preferredContentSize.

Оригинальный ответ ниже .

В вашем detailViewController добавьте это:

- (void)viewWillAppear:(BOOL)animated {

    CGSize size = CGSizeMake(320, 480); // size of view in popover
    self.contentSizeForViewInPopover = size;

    [super viewWillAppear:animated];

}

Вы также хотите добавить что-то похожее на ваш оригинальный DeviceDetailViewController, чтобы предотвратить изменение размера при нажатии на задний NavbarItem.

ответил borked 11 PM00000080000000531 2010, 20:04:05
0

Как и в случае с viewWillAppear, другой способ решить эту проблему - переопределить contentSizeForViewInPopover. Очень кратко:

-(CGSize)contentSizeForViewInPopover
{
    return self.view.bounds.size;
}
ответил Peter DeWeese 4 PM00000070000000631 2011, 19:54:06
0

У меня была похожая проблема.

У меня был подарок от кнопки на панели инструментов. Поповер был установлен на определенный размер. Это был вид таблицы. Когда была выбрана строка таблицы, был вызван новый контроллер представления с контроллером навигации.

Когда была нажата кнопка «Назад», поповер стал размером по умолчанию (я думаю, 320x1100) вместо того размера, который мне нужен.

Оригинальный код был:

  MyTableViewController *myVC = [[MyTableViewController alloc] init];
  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  [myVC release];
  [navController release];
  [popover release];

Я добавил одну строку, чтобы решить проблему. Конечно, это своего рода обходной путь, потому что мне пришлось вычесть высоту заголовка. Может быть, один из вас мог бы просветить меня лучшим методом. Во всяком случае, это работает.

  MyTableViewController *myVC = [[MyTableViewController alloc] init];

  UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:myVC];

  UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navController];
  popover.delegate = self;

  popover.popoverContentSize = CGSizeMake(400.0, 500.0);

  //Subtract the height of the header to match the total popover size (not just the view).
  myVC.contentSizeForViewInPopover = CGSizeMake(400.0, 500-44);

  [myVC release];
  [navController release];
  [popover release];

Я полагаю, что когда задействован навигационный контроллер и нажата кнопка «Назад», для всплывающего окна по умолчанию устанавливается размер по умолчанию. Добавляя свойство contentSizeForViewInPopover для контроллера представления myVC, оно принудительно задает определенный размер.

Надеюсь, это полезно.

Курт

ответил Kurt 9 FebruaryEurope/MoscowbWed, 09 Feb 2011 07:19:19 +0300000000amWed, 09 Feb 2011 07:19:19 +030011 2011, 07:19:19
0

Для iOS 7 используйте следующее:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGSize size = CGSizeMake(320, 768); // size of view in popover
    self.preferredContentSize = size;
}

UIViewController.contentSizeForViewInPopover устарел первым в iOS 7.

ответил Abdullah Umer 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 19:39:14 +0400000000pmWed, 12 Feb 2014 19:39:14 +040014 2014, 19:39:14
0

В ответ на графические глюки с анимацией:

Анимации UIPopoverController конфликтуют с анимациями контроллеров UINavigation, если вы создаете поповер с UINavigationController внутри него. Это приводит к графическим глюкам при анимации. Чтобы устранить проблему, установите для анимированного параметра значение false при нажатии других контроллеров или при отображении панели инструментов.

Нажав на контроллеры вида:

[self.navigationController pushViewController:detailViewController animated:NO];

Сделать панель инструментов видимой:

[[self navigationController] setToolbarHidden:NO animated:NO]; 

Установка анимированного: NO сделает анимации правильными в UIPopoverController.

ответил Paul Solt 19 +04002010-10-19T21:50:00+04:00312010bEurope/MoscowTue, 19 Oct 2010 21:50:00 +0400 2010, 21:50:00
0

Почему бы просто не установить contentSizeForViewInPopover, прежде чем помещать следующий контроллер в стек навигации? Нет необходимости устанавливать размеры в viewWillAppear и т. Д.

[nextController setContentSizeForViewInPopover:[self contentSizeForViewInPopover]];
[[self navigationController] pushViewController:nextController animated:YES];

Работает на IOS 5.1

ответил MrJre 14 J0000006Europe/Moscow 2012, 14:33:26
0

Небольшое отклонение от совета Борка (которое указало мне правильное направление, спасибо за это!), вот что я делаю, когда нажимаю новый контроллер, чтобы сохранить размер, прежде чем нажать его:

productViewController.contentSizeForViewInPopover = self.view.bounds.size;
self.contentSizeForViewInPopover = self.view.bounds.size;

[self.navigationController pushViewController:productViewController animated:YES];

Мне это нравится, потому что мне не нужно жестко кодировать значения popover в каждом контроллере представления (хорошо, так как я использую их на разных высотах).

Строка self.contentSizeForViewInPopover предназначена для сохранения размера, когда пользователь нажимает назад . Я думаю, вы могли бы поместить эту строку где-нибудь еще, например, viewWillAppear или где угодно.

Кажется, работает ...

ответил William Denniss 12 52010vEurope/Moscow11bEurope/MoscowFri, 12 Nov 2010 10:20:05 +0300 2010, 10:20:05
0

В - (void) viewDidLoad всех контроллеров представления, которые вы используете в навигации, напишите код:

self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
ответил SumiSadiq 3 MonEurope/Moscow2012-12-03T10:22:38+04:00Europe/Moscow12bEurope/MoscowMon, 03 Dec 2012 10:22:38 +0400 2012, 10:22:38
0

Есть два способа установить contentSizeForViewInPopover в раскадровке. Вы можете установить контроллеры вида, которые есть в вашем контроллере навигации, на FreeForm и установить корневые виды на нужный размер. Или вы можете оставить смоделированную метрику в качестве логического вывода и установить флажок «Использовать явный размер» и установить желаемый размер.

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

- (void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];

     ["yourpopoverController" setPopoverContentSize:CGSizeMake(self.
           contentSizeForViewInPopover.width, seld.contentSizeForViewInPopover.height + self.
           navigationController.navigationBar.frame.size.height) animated:YES];
}

В анимации перехода новый вид будет выровнен по верху, а затем высота будет соответствующим образом скорректирована.

Таким образом, вам не нужно переопределять contentSizeForViewInPopover или указывать какой-либо другой размер специально для ваших контроллеров представления. Это все в раскадровке.

Если один из ваших контроллеров представления имеет переменную высоту, вам нужно переопределить contentSizeForViewInPopover в этом представлении, например, так ...

- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(450, "calculate your height here");
}
ответил Matt Becker 15 Maypm13 2013, 18:45:00
0

Это может сработать один раз, но не с xCode 6, где contentSizeForViewInPopover устарела К счастью, это уважают во время загрузки раскадровки. Я скачал редактор XML (Xmplify) и взломал раскадровку. Установите для ключа contentSizeForViewInPopover нужный размер. Сохраните и замените (сначала сделайте копию) раскадровку.

Более конкретно:

< viewController>

     <value key="contentSizeForViewInPopover" type="size" width="450" height="280" / >

</viewController>
ответил Joe313 16 TueEurope/Moscow2014-12-16T18:31:28+03:00Europe/Moscow12bEurope/MoscowTue, 16 Dec 2014 18:31:28 +0300 2014, 18:31:28
0

Не работай для меня, когда я использую это:

[UIPopoverController 
    [UINavigationController] = root vc = [UIViewController vc1] => [UIViewController vc2] 
]
  

Когда появится popover, все в порядке, нажмите кнопку на vc1 и нажмите vc2 к контроллеру навигации

     

Затем вернитесь к нажатию кнопки vc1 (root) в vc2 (метод popToRootViewController);

     

Мы видим, что popover меняет собственный размер, но размер vc1 устарел ... ЧТО ЭТО ???

Хорошо, теперь работаем ... Добавьте свойство popover в мой контроллер

self.contentSizeForViewInPopover = (CGSize){400, 200};
self.navigationController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
self.popover.popoverContentSize = self.contentSizeForViewInPopover;
ответил iTux 1 SatEurope/Moscow2012-12-01T12:53:57+04:00Europe/Moscow12bEurope/MoscowSat, 01 Dec 2012 12:53:57 +0400 2012, 12:53:57
0

Запуск Swift 4 и iOS 11 был единственным возможным решением для меня. Использовать showViewController:sender: and showDetailViewController:sender: вместо presentViewController:animated:completion:.

Из Apple Doc

  

Методы showViewController: sender: и showDetailViewController: sender: предлагают наиболее гибкий и гибкий способ отображения контроллеров представления. Эти методы позволяют представителю представления решить, как лучше всего обрабатывать презентацию. Например, контроллер представления контейнера может включать контроллер представления как дочерний элемент вместо представления его модально. Поведение по умолчанию представляет контроллер представления модально.

ответил BilalReffas 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 14 Sep 2017 16:15:03 +0300 2017, 16:15:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132