it-swarm.com.ru

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

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

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

46
Punty

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

Другой способ заключается в следующем: указать actionBheet's cancelButtonIndex. 

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

24
Yiding

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

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

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

8
teebot

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

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

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

6
Chris

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

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

1
user2773279

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

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

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

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

0
Dmitry Sokurenko
    - (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. 

0
user3202661