在iOS 4.2中未正确绘制子类UIAlertView

时间:2010-11-24 17:03:52

标签: iphone uiview ios4 background uialertview

我已将UIAlertView子类化如下:

@interface NarrationAlertView : UIAlertView {
    UIImage * backgroundImage; //The image I want as custom background
    UILabel * textualNarrationView; //The test I wanna be displayed on the view        
}

并以这种方式实施:

- (id)initNarrationViewWithImage:(UIImage *)image{

    if (self = [super init]){
        UILabel * alertTextLabel = [[UILabel alloc] initWithFrame:CGRectZero];
        self.textualNarrationView = alertTextLabel;
        [alertTextLabel release];
        [self addSubview:alertTextLabel];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    /* Here I draw the image as background */
    CGSize imageSize = self.backgroundImage.size;
    [self.backgroundImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
}

- (void)layoutSubviews {
    /* To fit the text */
    [textualNarrationView sizeToFit];

    CGRect textRect = textualNarrationView.frame;
    textRect.origin.x = (CGRectGetWidth(self.bounds) - CGRectGetWidth(textRect)) / 2;
    textRect.origin.y = (CGRectGetHeight(self.bounds) - CGRectGetHeight(textRect)) / 2;
    textRect.origin.y -= 70;
    textualNarrationView.frame = textRect;
}

- (void)show{
    /* Showing the view */
    [super show];
    CGSize imageSize = self.backgroundImage.size;
    self.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height);
}

在以前版本的iOS上(我总是在模拟器上进行测试),子类运行正常并且在显示时显示正确绘制的自定义背景图像,并且只是文本,而在4.2版本它绘制了UIAlertView经典背景(蓝色圆角矩形)在我的图像顶部

我做错了什么?任何有关UIAlertView编程和UIView的建议都将受到赞赏。

更新有没有人可以分享一些UIAlertView替代课程?

3 个答案:

答案 0 :(得分:5)

我们在iOS 4.2中遇到了与UIAlertView类似的问题;我们正在自定义布局,添加文本框并重新排列按钮。

这不是一个受欢迎的答案,但由于UIAlertView的更改,我们不得不完全放弃使用它来实现此目的。我们一直都知道这是一个脆弱的实现,因为定制/子类化UIAlertView没有得到官方支持,并对视图层次结构的内部结构做出了假设,但4.2的发布确实让我们陷入了困境。

最后,我们实现了自己的UI元素来替换自定义的UIAlertView。

答案 1 :(得分:3)

在iOS 4.2之前,UIAlertView的标准深蓝色圆角矩形在drawRect中绘制。可以通过继承UIAlertView并实现drawRect而不调用super来删除圆角矩形。但是在4.2中,圆角矩形是UIImageView子视图。 快速,简单(不是最佳)解决方案:如果您没有向UIAlertView子类添加任何UIImageView实例,您只需删除通过观察子视图添加而加载的默认UIImageView:

- (void)didAddSubview:(UIView *)subview {
  if ([subview isMemberOfClass:[UIImageView class]]) {
    [subview removeFromSuperview];
  }
}

答案 2 :(得分:1)

我也被这个烧了。我最后写了一个替换类,我正在github上分享:

https://github.com/TomSwift/TSAlertView