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?
Ответы
Ответ 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.