Подтвердить что ты не робот

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

Вероятно, это может быть ошибка на iOS7. Но последняя кнопка не отделена от предыдущей UIActionSheet is missing separator on the last button

Как вы можете видеть из изображения. Это происходит как на Simulator, так и на устройстве с использованием 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?

4b9b3361

Ответ 1

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

Другой способ: указать actionSheet cancelButtonIndex.

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

Ответ 2

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

  • Запустите только файл UIActionSheet с заголовком
  • Добавьте свои кнопки
  • Добавить кнопку "ОТМЕНА" наконец
  • установите CancelButtonIndex в этот последний индекс

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

Ответ 3

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

[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;
}];

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

Ответ 4

Самое простое решение - передать @"" в заголовок кнопки отмены вместо 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];

Ответ 5

UIActionSheet *asAccounts = [[UIActionSheet alloc]
                            initWithTitle:Localized(@"select_an_account")
                            delegate:self
                            cancelButtonTitle:nil
                            destructiveButtonTitle:nil
                            otherButtonTitles: nil];

for (int i=0; i<[result count]; i++) {
    ACAccount *acct = [result objectAtIndex:i];
    [asAccounts addButtonWithTitle:[acct username]];
    asAccounts.tag = i;
}

[asAccounts addButtonWithTitle:Localized(@"Cancel")];                
asAccounts.cancelButtonIndex = result.count;
[asAccounts showInView:self.view];

Ответ 6

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

Ответ 7

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

Вместо этого вы должны:

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

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

Ответ 8

    - (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. У моего ActionSheet нет названия. И я хотел добавить разделитель между второй и третьей кнопками. Вот почему я использую номер 88.