2

У меня есть дизайн, который нуждается в том, что составляет UISplitViewController где-то, кроме корня приложения. Поскольку это незаконно по какой-то глупой причине (спасибо Apple), мне пришлось перекодировать некоторые аспекты этого вручную.Как отключить мой UITableView от изменения размера в popover ненадлежащим образом при перезагрузке, когда активна клавиатура?

Таблица располагается правильно в ландшафтном режиме, но когда я перемещаю ее в popover, я получаю некоторые странные проблемы. Первоначально у меня был popover достаточно долго, чтобы он должен был сжиматься, чтобы обеспечить место для клавиатуры, в результате чего TableView был слишком большим и обрезался. Поэтому я сократил popover ... и теперь TableView сжимается, когда я перезагружаю его данные (которые я должен делать, когда пользователь вводит ключ поиска). Обратите внимание, что ошибка показывает только после I reloadData tableView; и вместо того, чтобы отсекать, теперь, когда он сокращается, это «групповой бокс» сверху и снизу.

Когда я запрашиваю данные кадра, таблица достаточно странно, кажется, поддерживает ее высоту. Что это значит, я не знаю. Если я отклоняю popover и представляю его, это не устраняет проблему (я думаю, что popover больше увеличивается?), Но когда я вспоминаю клавиатуру, она делает (popover сжимается до правильной высоты). (Я не хочу пытаться сделать это как исправление, потому что это будет просто раздражать пользователя, который активно печатает).

Edit:

Если это имеет значение, только autolayout я применил это к UITableView; ему была задана фиксированная ширина и высота. Нет данных X или Y, которые могли быть ошибкой, за исключением того, что я генерирую ошибку при попытке ссылаться на супервизор - вероятно, потому, что popover не создает супервизор, пока я не попытаюсь его представить?

Edit: Запрошенный код (К сожалению это такой большой и уродливый блок):

-(void)setupViewsAfterRotation 
{ 
    if (UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) { 
     [self.searchTable.view removeFromSuperview]; 
     self.popover=[[UIPopoverController alloc] initWithContentViewController:self.searchTable]; 
     self.navigationItem.leftItemsSupplementBackButton=YES; 
     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"Search" 
                       style:UIBarButtonItemStylePlain 
                       target:self 
                       action:@selector(presentPopover)]; 
     [self setupPortraitConstraints]; 
     //NSLog(@"Intrinsic size data: width: %f and height: %f",self.searchTable.view.intrinsicContentSize.width, self.searchTable.view.intrinsicContentSize.height); 
     //NSLog(@"Runtime size data: width: %f and height: %f",self.searchTable.view.frame.size.width, self.searchTable.view.frame.size.height); 

    } else { 
     [self.popover dismissPopoverAnimated:NO]; 
     self.popover=nil; 
     self.navigationItem.leftBarButtonItem=nil; 
     [self.view addSubview:self.searchTable.view]; 
     [self setupLandscapeConstraints]; 
    } 
} 

-(void)setupLandscapeConstraints 
{ 
    if (self.tableViewConstraints) { 
     [self.view removeConstraints:self.tableViewConstraints]; 
     self.tableViewConstraints=nil; 
    } 
    NSMutableArray *landscapeConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableView(==256)]" 
                        options:0 
                        metrics:nil 
                        views:@{@"tableView": self.searchTable.view}] mutableCopy]; 

    [landscapeConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[topLayoutGuide][tableView]|" 
                         options:0 
                         metrics:nil 
                         views:@{@"tableView": self.searchTable.view, 
                           @"topLayoutGuide":[self topLayoutGuide] 
                           }]]; 
    self.tableViewConstraints=landscapeConstraints; 
    [self.view addConstraints:self.tableViewConstraints]; 
} 

-(void)setupPortraitConstraints 
{ 
    if (self.tableViewConstraints) { 
     [self.view removeConstraints:self.tableViewConstraints]; 
     self.tableViewConstraints=nil; 
    } 
    NSMutableArray *portraitConstraints; 
    if (self.keyboardHeight) { 
     NSLog(@"Height set to 612"); 
     portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==612)]" 
                    options:0 
                    metrics:nil 
                     views:@{@"tableView": self.searchTable.view}] mutableCopy]; 
     [self.popover setPopoverContentSize:CGSizeMake(256, 612) animated:YES]; 
    } 
    else{ 
     NSLog(@"Height set to 768"); 
     portraitConstraints=[[NSLayoutConstraint constraintsWithVisualFormat:@"V:[tableView(==768)]" 
                    options:0 
                    metrics:nil 
                     views:@{@"tableView": self.searchTable.view}] mutableCopy]; 
     [self.popover setPopoverContentSize:CGSizeMake(256, 768) animated:YES]; 
    } 

    [portraitConstraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"[tableView(==256)]" 
                        options:0 
                        metrics:nil 
                         views:@{@"tableView": self.searchTable.view}]]; 
    self.tableViewConstraints=portraitConstraints; 
    [self.searchTable.view addConstraints:self.tableViewConstraints]; 
} 
+0

Извините, вопрос еще не совсем ясен. Это из-за отсутствия кофе, изображений или кода, можете ли вы помочь с последними? Никаких скриншотов не требуется, некоторые базовые рисунки помогут. –

+1

Правильно ли вы задали размер контента для popover? – Krishnan

+0

@ Кришнан на самом деле, нет; Я думал, что с помощью Autolayout popover может использовать внутренний размер содержимого, предоставляемый TableView, когда я устанавливаю его ограничения автоопределения. (Который в какой-то мере работал некоторое время ...) Быстрый эксперимент подсказывает, что вы можете что-то сделать, позвольте мне сделать еще одну работу. – RonLugge

ответ

2

Установите размер контента для ограничения пирог область просмотра в поповер в.

Вы можете сделать это следующими способами:

  1. устанавливающих размер контента для использования метода пирог setPopoverContentSize :.
  2. настройка содержимогоSizeForViewInPopover для контроллера содержимого.

От Apple's Documentation:

Popovers обычно получают их размер с точки зрения контроллера они настоящего. Однако вы можете изменить размер popover, изменив значение на значение свойства popoverContentSize или вызвав метод setPopoverContentSize: анимированный метод . Последний подход - , особенно эффективный, если вам необходимо анимировать изменения в размерепопсора. Указанный размер является только предпочтительным размером для вида popover. Фактический размер может быть изменен для обеспечения того, чтобы походка помещалась на экран и не сталкивалась с клавиатурой.

От Apple's documentation относительно popoverContentSize собственности:

Изменение значения этого свойства переопределяет значение по умолчанию текущего контроллера представления . Переопределенное значение сохраняется до тех пор, пока вы не установили новый контроллер представления контента в приемник. Таким образом, если вы хотите сохранить свое переопределенное значение, вы должны переназначить его после смены контроллера содержимого.

+0

contentSizeForViewInPopover устарел в iOS 7. Вместо этого используйте свойство preferredContentSize –

Смежные вопросы