在UIAlertView中向下移动按钮

时间:2012-01-07 20:05:15

标签: iphone ios uialertview

我有一个以横向模式显示的应用,我用以下代码覆盖了UIAlertView的高度:

- (void) willPresentAlertView:(UIAlertView *)alertView
{
    CGRect screenBounds = [[UIScreen mainScreen] bounds];
    CGRect frame = [alertView frame];
    alertView.frame = CGRectMake(frame.origin.x, 0, frame.size.width, screenBounds.size.width);
}

这几乎可行。 UIAlertView更高,但是,警报视图中的按钮不会被按下。

当我更改提醒视图的高度时,是否有人知道如何在UIAlertView按下按钮?

4 个答案:

答案 0 :(得分:1)

我认为用一些独立的AlertView替换UIAlertView而不是搞乱它更优雅,风险更小。独立我的意思是不继承UIAlertView形式。
TSAlertView就是这样的替代品。

http://dl.dropbox.com/u/47535/TSAlertView/1-thumb.png http://dl.dropbox.com/u/47535/TSAlertView/3-thumb.png http://dl.dropbox.com/u/47535/TSAlertView/2-thumb.png

答案 1 :(得分:0)

我猜你可能必须继承/操作UIAlertView类来实现这一点,这可能会有风险,因为Apple可以更改它们的实现,因此将代码包装在适当的检查中。

一开始就是:

NSLog(@"UIAlertView subviews: %@",alertView.subviews);

那将为构成UIAlertView的各种元素打印一些输出,你可能会看到一些UIButtons,你可以通过使用类似的东西来操作:

UIButton* button1 = (UIButton*)[alertView.subviews objectAtIndex:N];
[button1 setFrame:CGRect(button1.frame.origin.x, button1.frame.origin.y+10, button1.frame.size.width, button1.frame.size.height)]

合理的检查是在对它执行操作之前确认objectAtIndex是正确的元素类型,但这不是万无一失的,因为Apple可以添加更多的UIButton或其他东西..

if ([[alertView.subviews objectAtIndex:N] isKindOfClass:[UIButton class]]) {
  ...
}

根据您的情况,您可能还想迭代子视图数组并向下移动所有UIButton,而不仅仅是在某些特定对象中进行硬编码,但这是另一个答案。 : - )

答案 2 :(得分:0)

This link应该有所帮助。在我看来,我不会尝试搞乱视图层次结构。这可能会导致App Store拒绝。从头开始构建一个新的AlertView,或保持原样。

答案 3 :(得分:0)

NSArray * subViewArray = [alertView subviews];

for (NSUInteger ind=0 ; ind < [subViewArray count]; ind++) {

    if ([[alertView.subviews objectAtIndex:ind] isKindOfClass:[UIButton class]]) {
        UIButton* button1 = (UIButton*)[alertView.subviews objectAtIndex:ind];
        [button1 setFrame:CGRectMake(button1.frame.origin.x, button1.frame.origin.y+100, button1.frame.size.width, button1.frame.size.height)];
        NSLog(@"button1.frame.origin.y=[%1.0f]",button1.frame.origin.y);

    }
}