UIAlertView с подклассами не отображается правильно в iOS 4.2 - PullRequest
2 голосов
/ 24 ноября 2010

Я подклассифицировал 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 ]

5 голосов
/ 24 ноября 2010

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

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

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

3 голосов
/ 21 декабря 2010

До 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];
  }
}
1 голос
/ 24 января 2011

Меня это тоже обожгло.В итоге я написал класс замены, которым делюсь на github:

https://github.com/TomSwift/TSAlertView

...