UIActionSheet не показывает разделитель в последнем элементе на iOS 7 GM

Вероятно, это ошибка на iOS7. Но последняя кнопка не отделена от предыдущейUIActionSheet отсутствует разделитель на последней кнопке

Как вы можете видеть на изображении. Это происходит как на симуляторе, так и на устройстве с iOS7 GM. У всех такая же проблема?

UIActionSheet *actionSheet = [[UIActionSheet alloc]
               initWithTitle:@"Title"
               delegate:self
               cancelButtonTitle:nil
               destructiveButtonTitle:nil
               otherButtonTitles:@"First", @"Second", @"Third", @"Fourth", nil];
[actionSheet showInView:self.view];

Как видите, код довольно простой. Любая идея о том, как решить проблему? Или какая-то сторонняя библиотека, которую я могу использовать вместо UIActionSheet?


person Punty    schedule 13.09.2013    source источник
comment
Скорее всего это баг iOS. Отправьте отчет об ошибке. Я вижу что-то подобное в UITableViews. В некоторых строках отсутствуют разделители. Я думаю, что не стоит пытаться исправить это с помощью сторонней библиотеки. Я почти уверен, что скоро будет GM2.   -  person Matthias Bauch    schedule 13.09.2013
comment
devforums.apple.com/message/857939#857939 предлагает обходной путь передачи @ для элемента CancelButtonTitle (iPad)   -  person wattson12    schedule 13.09.2013
comment
Обходной путь сработал!   -  person nacho4d    schedule 29.09.2013
comment
@ wattson12 это хороший обходной путь, но если мне не нужна кнопка отмены, что я могу сделать?   -  person JJ86    schedule 23.01.2014


Ответы (7)


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

Другой способ: укажите значение cancelButtonIndex для actionSheet.

Например, в вашем случае вы можете добавить "Cancel" в otherButtonTitles с индексом 4, а затем указать actionSheet.cancelButtonIndex = 4.

person Yiding    schedule 04.10.2013
comment
Сначала я не думал, что это идеально, но чего я не понимал, так это того, что если вы добавите кнопку отмены, iPad будет достаточно умен, чтобы не отображать ее. (Это верно и для iOS 6.) Поскольку на iPhone должна быть кнопка отмены, это решение отлично работает. - person robotspacer; 03.11.2013
comment
Я думаю, что ActionSheet требует кнопки отмены ... это не так. Apple заявляет в документации: ... Укажите nil, если вам не нужна кнопка отмены или вы представляете лист действий на iPad. Однако добавление @ вместо nil работает для меня, как указано ниже. - person Stephen Watson; 17.03.2014

Я нашел способ заставить его работать на iPhone и iPad наименее хакерским способом:

  1. Инициируйте только UIActionSheet с заголовком
  2. Добавьте свои кнопки
  3. Добавьте, наконец, кнопку "ОТМЕНА"
  4. установите CancelButtonIndex на этот последний индекс

Я предполагаю, что отсутствующий разделитель вызван тем, что кнопка отмены не распознается как отдельный случай при ее первом добавлении или через init.

person teebot    schedule 28.04.2014
comment
Это правильный путь. - person Legoless; 07.08.2014
comment
Согласитесь, потратив целый день на эту проблему (UIActionSheet согласован для iPhone/iPad и iOS7/iOS8), я в конечном итоге использовал этот подход. Кроме того, я добавляю деструктивную кнопку между шагами 1 и 2 (т.е. как первую кнопку). - person Sebastian Greifeneder; 14.05.2015

Я обнаружил, что добавление кнопки отмены с пустой строкой после инициализации работает. Кнопка отмены не отображается, и отображается разделитель.

[sheet addButtonWithTitle: @""];
[sheet setCancelButtonIndex: sheet.numberOfButtons - 1];

Но это работает только для iPad. На iPhone появляется пустая кнопка отмены, но я нашел хакерский обходной путь, чтобы заставить ее работать. В дополнение к вышесказанному, в willPresentActionSheet добавьте этот код в:

NSInteger offset = 55;
CGRect superFrame = actionSheet.superview.frame;
superFrame.origin.y += offset;
[actionSheet.superview setFrame: superFrame];

// hide underlay that gets shifted with the superview
[(UIView*)[[actionSheet.superview subviews] objectAtIndex: 0] removeFromSuperview];

// create new underlay
CGRect underlayFrame = CGRectMake(0, -offset, superFrame.size.width, superFrame.size.height);
UIView* underlay = [[UIView alloc] initWithFrame: underlayFrame];
underlay.alpha = 0.0f;
[underlay setBackgroundColor: [UIColor colorWithWhite: 0.0f alpha: 0.4f]];
[actionSheet.superview insertSubview: underlay atIndex: 0];

// simulate fade in
[UIView animateWithDuration: 0.3f animations:^{
    underlay.alpha = 1.0f;
}];

Это сдвигает лист вниз, чтобы скрыть кнопку отмены с экрана.

person Chris    schedule 07.11.2013

Самое простое решение — передать @"" в заголовок кнопки отмены вместо nil во время распределения.

UIActionSheet *actionSheet = [[UIActionSheet alloc]
               initWithTitle:@"Title"
               delegate:self
               cancelButtonTitle:@"" // change is here
               destructiveButtonTitle:nil
               otherButtonTitles:@"First", @"Second", @"Third", @"Fourth", nil];
[actionSheet showInView:self.view];
person aha    schedule 21.03.2014

Если у вас есть кнопка отмены, будет показана последняя строка. Это временное исправление, которое я использую сейчас. Не знаю никакого решения, если вы не хотите, чтобы кнопка отмены отображалась

person user2773279    schedule 30.09.2013

Похоже, что метод initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles: глючит, и здесь вообще не следует указывать кнопку отмены. Кстати, кажется, что деструктивная кнопка, установленная в этом методе, тоже не будет работать очень хорошо.

Вместо этого следует:

  • предоставить пользовательскую кнопку отмены в качестве последней кнопки в массиве кнопок, например: ["Action 1", "Action 2", "Close"] или sheet.addButtonWithTitle("Close")
  • вручную установите индекс кнопки отмены, например. sheet.cancelButtonIndex = 2

Тогда все будет работать как положено. На iPad кнопка будет автоматически скрыта, а на iPhone она будет оформлена и размещена соответствующим образом.

person Dmitry Sokurenko    schedule 21.01.2015

    - (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
    if ([UIDevice currentDevice].systemVersion.floatValue < 8.0f) {
        UIView *separator = [[UIView alloc] initWithFrame:CGRectMake(8, 88, actionSheet.frame.size.width - 16, 0.5)];
        separator.backgroundColor = [UIColor colorWithRed:219.0f/255 green:219.0f/255 blue:223.0f/255 alpha:1];
        [actionSheet addSubview:separator];
    }
}

Каждая кнопка имеет высоту 44. У моего листа действий нет заголовка. И я хотел добавить разделитель между второй и третьей кнопками. Вот почему я использую номер 88.

person user3202661    schedule 28.04.2015