Ответ 1
Вот проект Github, чтобы добавить любой UIView в окно просмотра UIAlertView на iOS7.
(Скопировано из fooobar.com/questions/86530/....)
Добавление некоторых элементов управления в UIAlertView
было устаревшим в iOS7 с использованием метода addSubview
. Как я знаю, Apple обещала добавить свойство contentView
.
iOS 7 теперь выпущен, и я вижу, что это свойство не добавлено. Вот почему я ищу какое-то пользовательское решение с возможностью добавления индикатора прогресса в это alertView. Что-то вроде, например, TSAlertView, но более готово для использования в iOS 7.
Вот проект Github, чтобы добавить любой UIView в окно просмотра UIAlertView на iOS7.
(Скопировано из fooobar.com/questions/86530/....)
Мне понадобилось всего 1 день, чтобы создать собственное представление предупреждения, которое выглядит точно так же, как Apple
UIButton
, ячейка таблицы по умолчанию достаточно хороша). Обратите внимание, что вам нужны 3 кнопочные таблицы: два для левой и правой кнопок (каждый раз, когда количество кнопок равно 2), другое - для других случаев (одна кнопка или более двух кнопок).Внесите все методы из UIAlertView
в пользовательское оповещение.
Show/Dismiss - вы можете создать специальное модальное окно для своих предупреждений, но я просто помещаю свои предупреждения поверх моего контроллера корневого представления. Зарегистрируйте свои видимые предупреждения в статическом массиве. Если вы показываете первое предупреждение/отклоняете последнее, измените режим оттенка вашего контроллера окна/представления, чтобы затемнить/автоматически и добавить/удалить вид затемнения (черный с альфа = 0,2).
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
}];
Я написал полную реализацию UIAlertView, которая имитирует полный API UIAlertView, но добавляет свойство contentView, которое мы все так долго хотели: SDCAlertView.
Для тех, кто любит простые и эффективные методы, не имея необходимости писать строки кода. Вот крутое решение без использования каких-либо других частных фреймов для добавления подзонов в представления 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];
}
Надеюсь, это поможет кому-то, спасибо:)
Для 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];
Там не будет UIAlertView
с пользовательскими представлениями в iOS7 и contentView
, о которых Apple изменила свое мнение, поэтому addSubview
теперь невозможно в UIAlertView
.
Хорошей альтернативой будет SVProgressHUD, согласно многим темам на форуме Apple.
Edit
Официально нет addSubview
или подклассов для UIAlertView
в iOS7.
Класс UIAlertView предназначен для использования как есть, а не поддержка подкласса. Иерархия представления для этого класса является частной и не должны быть изменены.
Другие хорошие альтернативы:
Вы можете найти простое решение без дополнительных классов здесь
Он основан на настройке аксессуаров для обычного UIAlertView.
PKAlertController (https://github.com/goodpatch/PKAlertController) - отличная библиотека. Я тестировал множество подобных библиотек, и это удовлетворило все мои требования.
Почему это круто: