2010-11-24 2 views
2

Я подклассы в UIAlertView следующим образом:подклассы UIAlertView не рисуются правильно прошивка 4.2

@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); 
} 

На предыдущих версиях прошивки (я всегда проверяя на симуляторе), подкласс работает нормально, и когда он отображается, он отображает правильно настроенное фоновое изображение и просто текст, тогда как в версии 4.2 он рисует классический фон UIAlertView (синий прямоугольник с округлыми углами) сверху моего изображения.

Что я делаю неправильно? Любое предложение о программировании UIAlertView и UIView тоже будет оценено.

ОБНОВЛЕНИЕ У кого-нибудь есть класс замены UIAlertView?

ответ

5

У нас была аналогичная проблема с UIAlertView в iOS 4.2; мы настраивали макет, добавляли текстовые поля и переставляли кнопки.

Это не будет популярным ответом, но из-за изменений в UIAlertView нам пришлось отказаться от его использования для этой цели. Мы всегда знали, что это была хрупкая реализация, поскольку настройка/подклассификация UIAlertView официально не поддерживается и делает предположения о внутренней структуре иерархии представлений, но релиз 4.2 действительно ввел нас в игру.

В конце концов, мы внедрили наш собственный элемент пользовательского интерфейса для замены настроенного UIAlertView.

+0

Я боялся, что, как бы вы сделали эффект раскрывающегося в сочетании с фоновой тенью зрения? – rano 2010-11-24 20:01:31

+0

На самом деле мы по-другому поменялись с пользовательским интерфейсом, то, что раньше было всплывающим, теперь скользит вниз или скользит вверху экрана. Я просмотрел репликацию всплывающего эффекта и нашел эту полезную ссылку: http: //delackner.com/blog/2009/12/mimicking-uialertviews-animated-transition/ – 2010-11-24 20:04:30

3

До iOS 4.2 Стандартный синей округлой прямоугольник UIAlertView был нарисован в drawRect. округленный прямоугольник может быть удален путем подкласса UIAlertView и реализации drawRect без вызова super. однако в 4.2 закругленный прямоугольник является подвью UIImageView. быстрое, легкое (не лучшее) Решение: Если вы не добавление каких-либо экземпляров UIImageView к вашему UIAlertView подклассу вы можете просто удалить UIImageView по умолчанию, который загружается с помощью наблюдения дополнений подвида:

- (void)didAddSubview:(UIView *)subview { 
    if ([subview isMemberOfClass:[UIImageView class]]) { 
    [subview removeFromSuperview]; 
    } 
} 
Смежные вопросы