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.

Например във вашия случай можете да добавите „Отказ“ в otherButtonTitles при индекс 4 и след това да посочите actionSheet.cancelButtonIndex = 4.

person Yiding    schedule 04.10.2013
comment
Първоначално не мислех, че това е идеално, но това, което не осъзнах, е, че ако добавите бутон за отказ, iPad е достатъчно умен, за да не го показва. (Това важи и за iOS 6.) Тъй като iPhone трябва да има бутон за отказ, това решение работи перфектно. - person robotspacer; 03.11.2013
comment
Мисля, че ActionSheet изисква бутон за отмяна ... не е така. Състояние на Apple в документацията: ... Посочете нула, ако не искате бутон за отказ или представяте листа с действия на iPad. Въпреки това, добавянето на @ вместо нула работи за мен, както е публикувано по-долу. - 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