Кажется, что SDK не поддерживает это поведение. Две кнопки в UIAlertView всегда будут отображаться в горизонтальной компоновке.
Однако довольно просто просто создать подкласс UIAlertView , чтобы получить намеченное поведение. Давайте назовем класс VerticalAlertView .
Следующий код работает только для просмотра предупреждений с двумя кнопками, так как более двух кнопок в UIAlertView будут автоматически отображаться в вертикальной компоновке.
VerticalAlertView.h так же просто, как это:
#import <UIKit/UIKit.h>
@interface VerticalAlertView : UIAlertView
@end
VerticalAlertView.m
#import "VerticalAlertView.h"
@implementation VerticalAlertView
- (void)layoutSubviews
{
[super layoutSubviews];
int buttonCount = 0;
UIButton *button1;
UIButton *button2;
// first, iterate over all subviews to find the two buttons;
// those buttons are actually UIAlertButtons, but this is a subclass of UIButton
for (UIView *view in self.subviews) {
if ([view isKindOfClass:[UIButton class]]) {
++buttonCount;
if (buttonCount == 1) {
button1 = (UIButton *)view;
} else if (buttonCount == 2) {
button2 = (UIButton *)view;
}
}
}
// make sure that button1 is as wide as both buttons initially are together
button1.frame = CGRectMake(button1.frame.origin.x, button1.frame.origin.y, CGRectGetMaxX(button2.frame) - button1.frame.origin.x, button1.frame.size.height);
// make sure that button2 is moved to the next line,
// as wide as button1, and set to the same x-position as button1
button2.frame = CGRectMake(button1.frame.origin.x, CGRectGetMaxY(button1.frame) + 10, button1.frame.size.width, button2.frame.size.height);
// now increase the height of the (alert) view to make it look nice
// (I know that magic numbers are not nice...)
self.bounds = CGRectMake(0, 0, self.bounds.size.width, CGRectGetMaxY(button2.frame) + 15);
}
@end
Теперь вы можете использовать свой класс, как и любой другой UIAlertView :
[[[VerticalAlertView alloc] initWithTitle:@"Title"
message:@"This is an alert message!"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:@"Second Button", nil] autorelease] show];
И вы получите следующий результат:
EDIT:
Использование этого метода немного рискованно (не говоря уже о хакерстве), так как Apple может изменить реализацию UIAlertView в некоторый момент, что может нарушить ваш макет. Я просто хотел отметить, что это будет легким и быстрым решением вашей проблемы. Как упомянуто в UIAlertView ссылка:
"Класс UIAlertView предназначен для использования как есть и не
поддержка подклассов. Иерархия представления для этого класса является частной и
не должен быть изменен. "