UIAlertView addSubview в iOS7

Добавление некоторых элементов управления в UIAlertView было устаревшим в iOS7 с использованием метода addSubview. Как я знаю, Apple обещала добавить свойство contentView.

iOS 7 теперь выпущен, и я вижу, что это свойство не добавлено. Вот почему я ищу какое-то пользовательское решение с возможностью добавления индикатора прогресса в это alertView. Что-то вроде, например, TSAlertView, но более готово для использования в iOS 7.

Ответ 2

Мне понадобилось всего 1 день, чтобы создать собственное представление предупреждения, которое выглядит точно так же, как Apple

  • Сделайте снимок экрана оповещения Apple о ссылках (размеры шрифта, расстояния, ширина)
  • Создайте xib с заголовком, сообщением, пользовательским представлением и таблицами для кнопок (теперь Apple использует таблицы вместо UIButton, ячейка таблицы по умолчанию достаточно хороша). Обратите внимание, что вам нужны 3 кнопочные таблицы: два для левой и правой кнопок (каждый раз, когда количество кнопок равно 2), другое - для других случаев (одна кнопка или более двух кнопок).
  • Внесите все методы из UIAlertView в пользовательское оповещение.

  • Show/Dismiss - вы можете создать специальное модальное окно для своих предупреждений, но я просто помещаю свои предупреждения поверх моего контроллера корневого представления. Зарегистрируйте свои видимые предупреждения в статическом массиве. Если вы показываете первое предупреждение/отклоняете последнее, измените режим оттенка вашего контроллера окна/представления, чтобы затемнить/автоматически и добавить/удалить вид затемнения (черный с альфа = 0,2).

  • Размытый фон - используйте образец кода Apple (я использовал непрозрачный белый цвет)
  • 3D динамические эффекты - используйте образец кода Apple (5 строк кода). Если вам нужен приятный эффект, сделайте чуть больший снимок на шаге 5 и добавьте обратные аниматоры для фона оповещений и переднего плана.

EDIT:

Как размытый фон, так и пример кода паралакс-эффекта можно найти в "iOS_RunningWithASnap" пример кода WWDC 2013

Эффект паралакса:

UIInterpolatingMotionEffect* xAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x"
                                                                                     type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis] autorelease];
xAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
xAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];

UIInterpolatingMotionEffect* yAxis = [[[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y"
                                                                                     type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis] autorelease];
yAxis.minimumRelativeValue = [NSNumber numberWithFloat:-10.0];
yAxis.maximumRelativeValue = [NSNumber numberWithFloat:10.0];

UIMotionEffectGroup *group = [[[UIMotionEffectGroup alloc] init] autorelease];
group.motionEffects = @[xAxis, yAxis];
[self addMotionEffect:group];

Размытый фон - единственная сложная вещь. Если вы можете использовать непрозрачный цвет, используйте его. В противном случае это много экспериментирует. Также обратите внимание, что размытый фон не является хорошим решением, когда фон темный.

Для анимации show/увольнения, я использую новый метод анимации spring:

void (^animations)() = ^{
    self.alpha = 1.0f;
    self.transform = CGAffineTransformIdentity;
};

self.alpha = 0.0f;
self.transform = CGAffineTransformMakeScale(0.5f, 0.5f);

[UIView animateWithDuration:0.3
                      delay:0.0
     usingSpringWithDamping:0.7f
      initialSpringVelocity:0.0f
                    options:UIViewAnimationOptionCurveLinear
                 animations:animations
                 completion:^(BOOL completed) {
                         //calling UIAlertViewDelegate method
                     }];

Ответ 3

Я написал полную реализацию UIAlertView, которая имитирует полный API UIAlertView, но добавляет свойство contentView, которое мы все так долго хотели: SDCAlertView.

image

Ответ 4

Для тех, кто любит простые и эффективные методы, не имея необходимости писать строки кода. Вот крутое решение без использования каких-либо других частных фреймов для добавления подзонов в представления iOS 7 alert, т.е.

[alertView setValue: imageView forKey: @ "accessoriesView" ];

Пример кода для лучшего понимания,

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(180, 10, 85, 50)];
UIImage *wonImage = [UIImage imageNamed:@"image.png"];
[imageView setImage:wonImage];

//check if os version is 7 or above
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
      [alertView setValue:imageView forKey:@"accessoryView"];
}else{
      [alertView addSubview:imageView];
}

Надеюсь, это поможет кому-то, спасибо:)

Ответ 5

Для IOS7

UIAlertView *alertView1 = [[UIAlertView alloc] initWithTitle:@"Enter Form Name" 
                                               message:@""
                                               delegate:self 
                                               cancelButtonTitle:@"Cancel"
                                               otherButtonTitles:@"Ok", nil];
alertView1.alertViewStyle = UIAlertViewStyleSecureTextInput;
UITextField *myTextField = [alertView1 textFieldAtIndex:0];
[alertView1 setTag:555];
myTextField.keyboardType=UIKeyboardTypeAlphabet;

[alertView1 show];

Ответ 6

Там не будет UIAlertView с пользовательскими представлениями в iOS7 и contentView, о которых Apple изменила свое мнение, поэтому addSubview теперь невозможно в UIAlertView.

Хорошей альтернативой будет SVProgressHUD, согласно многим темам на форуме Apple.

Edit

Официально нет addSubview или подклассов для UIAlertView в iOS7.

Класс UIAlertView предназначен для использования как есть, а не поддержка подкласса. Иерархия представления для этого класса является частной и не должны быть изменены.

Другие хорошие альтернативы:

ios-custom-alertview от wimagguc

MZFormSheetController.

Ответ 7

Вы можете найти простое решение без дополнительных классов здесь

Он основан на настройке аксессуаров для обычного UIAlertView.

Ответ 8

PKAlertController (https://github.com/goodpatch/PKAlertController) - отличная библиотека. Я тестировал множество подобных библиотек, и это удовлетворило все мои требования.

Почему это круто:

  • Поддержка пользовательского представления
  • Поддержка iOS7
  • Это контроллер просмотра.
  • Он ведет себя и выглядит как собственное представление предупреждения, включая эффекты движения
  • Настраиваемый
  • Подобный интерфейс, например, в UIAlertController