2012-05-17 3 views
1

В универсальном приложении у меня есть UIView, который представлен внутри iPhone-Screen-Sized контроллера popover на iPad и Modal View Controller на iPhone/Touch.UIActionSheet с 20+ опциями внутри UIPopoverController

Этот UIView, если пользователь удаляет определенную кнопку, представляет таблицу UIActionSheet с 20 + элементами. На iPhone экран действия заполняет экран с помощью прокручиваемого «колесика» списка стилей. Однако, на iPad, поведение не в порядке: лист действий снова представляет собой список колесных дисков, но очень высокий; он расширяет popover до максимально возможной высоты, но лист действий по-прежнему выше, чем popover. Так что вы заканчиваете с невероятно высоким popover с списком колесных дисков, который частично отрезан наверху, и не имеет возможности добраться до предметов в верхней части списка. См. Изображения ниже.

В любом случае: мне идеально хотелось бы точно то же самое, что вы видите на iPhone, чтобы появиться внутри этого popover, не изменяя размер popover. Это выполнимо?

Изображение: iPhone версия после представления действий листа:

iPhone version after presenting action sheet

IPad версия показывает оригинальные UIView с помощью кнопки нажать:

iPad version showing original UIview with button to press

IPad версия после нажатия кнопки, показывая actionsheet :

iPad version after pressing button, showing actionsheet

+1

Перефразируя «Если у вашего UIActionSheet есть двадцать вариантов, вы, вероятно, пропустили некоторые« –

+0

Ha! Это в основном просто список визуальных тем; это статический список, поэтому кажется глупым беспокоиться о настольном представлении. – DanM

ответ

0

EDIT: Я собрал более полное решение здесь https://github.com/brandonschlenker/BSActionSheet

Это немного боли и, честно говоря, я не уверен, если это стоит усилий. Если Apple когда-либо изменит UIActionSheet, все это, скорее всего, сломается. В любом случае, вот что может быть решением ...

Вам понадобится подкласс UIActionSheet и измените размер всех его подзонов и супервизоров.

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

- (void)layoutSubviews 
{ 
    CGRect tableViewFrame = CGRectZero; 
    for (id item in [self subviews]) 
    { 
     if ([item isKindOfClass:[UIView class]]) 
     { 
      UIView *v = (UIView *)item; 
      v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, self.frame.size.width, 320); 

      for (UIView *subItem in [v subviews]) 
      { 
       //table view of options 
       if ([subItem isKindOfClass:[UITableView class]]) 
       { 
        subItem.frame = CGRectMake(subItem.frame.origin.x, subItem.frame.origin.y, subItem.frame.size.width, someNewHeightHere); 
        tableViewFrame = subItem.frame; 
       } 

       //table view image frame. this rounds the bottom corners 
       if ([subItem isKindOfClass:[UIView class]] && subItem.tag == 3334) 
       { 
        subItem.frame = CGRectMake(subItem.frame.origin.x, tableViewFrame.origin.y, subItem.frame.size.width, someNewHeightHere); 
       } 

       //this is the cancel buttons label. never could get this to do anything 
       if ([subItem isKindOfClass:NSClassFromString(@"UIButtonLabel")]) 
       { 
         if (subItem.frame.size.width == 66) 
         { 

         } 
       } 
      } 
     } 
    } 

    UIViewController *v = [self viewController]; 
    v.contentSizeForViewInPopover = CGSizeMake(self.frame.size.width, someNewHeightHere);  
} 

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

- (UIViewController *)viewController 
    { 
     UIResponder *responder = self; 
     while (![responder isKindOfClass:[UIViewController class]]) { 
      responder = [responder nextResponder]; 
      if (nil == responder) { 
       break; 
      } 
     } 
     return (UIViewController *)responder; 
    } 
+0

Спасибо за ссылку. Я могу закончить просто создание пользовательского представления, так как проблема Apple, которая меняет UIActionSheet и ломает ее ... менее привлекательна. Однако это определенно кажется лучшим способом пойти, придерживаясь листа действий. – DanM

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