2012-03-30 1 views
1

У меня есть приложение, в котором я показываю сообщение с предупреждением, используя UIAlertView. По умолчанию цвет диалогового окна синий. Может ли кто-нибудь сказать мне, как изменить цвет этого? Можно ли это изменить?Как изменить цвет диалогового окна UIAlertView в iOS?

+1

пройти через это [обсуждалось ранее вопрос] [1] [1]: http://stackoverflow.com/questions/883208/change-the-background-color-of-a-uialertview –

ответ

9

Использование Как Содержание этого

[CustomAlert setBackgroundColor:[UIColor blueColor] 
    withStrokeColor:[UIColor greenColor]]; 

.h и .m файла

CustomAlert.h

#import <UIKit/UIKit.h> 

@interface CustomAlert : UIAlertView 
{ 

} 

+ (void) setBackgroundColor:(UIColor *) background 
    withStrokeColor:(UIColor *) stroke; 

@end 

CustomAlert.m

#import "CustomAlert.h" 

@interface CustomAlert (Private) 

- (void) drawRoundedRect:(CGRect) rect inContext:(CGContextRef) 
    context withRadius:(CGFloat) radius; 

@end 



static UIColor *fillColor = nil; 
static UIColor *borderColor = nil; 

@implementation CustomAlert 

+ (void) setBackgroundColor:(UIColor *) background 
    withStrokeColor:(UIColor *) stroke 
{ 
    if(fillColor != nil) 
    { 
     [fillColor release]; 
     [borderColor release]; 
    } 

    fillColor = [background retain]; 
    borderColor = [stroke retain]; 
} 

- (id)initWithFrame:(CGRect)frame 
{ 
    if((self = [super initWithFrame:frame])) 
    { 
     if(fillColor == nil) 
     { 
      fillColor = [[UIColor blackColor] retain]; 
      borderColor = [[UIColor colorWithHue:0.625 
       saturation:0.0 brightness:0.8 alpha:0.8] 
        retain]; 
     } 
    } 

    return self; 
} 

- (void)layoutSubviews 
{ 
    for (UIView *sub in [self subviews]) 
    { 
     if([sub class] == [UIImageView class] && sub.tag == 0) 
     { 
      // The alert background UIImageView tag is 0, 
      // if you are adding your own UIImageView's 
      // make sure your tags != 0 or this fix 
      // will remove your UIImageView's as well! 
      [sub removeFromSuperview]; 
      break; 
     } 
    } 
} 

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextClearRect(context, rect); 
    CGContextSetAllowsAntialiasing(context, true); 
    CGContextSetLineWidth(context, 0.0); 
    CGContextSetAlpha(context, 0.8); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, [borderColor CGColor]); 
    CGContextSetFillColorWithColor(context, [fillColor CGColor]); 

    // Draw background 
    CGFloat backOffset = 2; 
    CGRect backRect = CGRectMake(rect.origin.x + backOffset, 
     rect.origin.y + backOffset, 
     rect.size.width - backOffset*2, 
     rect.size.height - backOffset*2); 

    [self drawRoundedRect:backRect inContext:context withRadius:8]; 
    CGContextDrawPath(context, kCGPathFillStroke); 

    // Clip Context 
    CGRect clipRect = CGRectMake(backRect.origin.x + backOffset-1, 
     backRect.origin.y + backOffset-1, 
     backRect.size.width - (backOffset-1)*2, 
     backRect.size.height - (backOffset-1)*2); 

    [self drawRoundedRect:clipRect inContext:context withRadius:8]; 
    CGContextClip (context); 

    //Draw highlight 
    CGGradientRef glossGradient; 
    CGColorSpaceRef rgbColorspace; 
    size_t num_locations = 2; 
    CGFloat locations[2] = { 0.0, 1.0 }; 
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35, 1.0, 1.0, 1.0, 0.06 }; 
    rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, 
     components, locations, num_locations); 

    CGRect ovalRect = CGRectMake(-130, -115, (rect.size.width*2), 
     rect.size.width/2); 

    CGPoint start = CGPointMake(rect.origin.x, rect.origin.y); 
    CGPoint end = CGPointMake(rect.origin.x, rect.size.height/5); 

    CGContextSetAlpha(context, 1.0); 
    CGContextAddEllipseInRect(context, ovalRect); 
    CGContextClip (context); 

    CGContextDrawLinearGradient(context, glossGradient, start, end, 0); 

    CGGradientRelease(glossGradient); 
    CGColorSpaceRelease(rgbColorspace); 
} 

- (void) drawRoundedRect:(CGRect) rrect inContext:(CGContextRef) context 
     withRadius:(CGFloat) radius 
{ 
    CGContextBeginPath (context); 

    CGFloat minx = CGRectGetMinX(rrect), midx = CGRectGetMidX(rrect), 
     maxx = CGRectGetMaxX(rrect); 

    CGFloat miny = CGRectGetMinY(rrect), midy = CGRectGetMidY(rrect), 
     maxy = CGRectGetMaxY(rrect); 

    CGContextMoveToPoint(context, minx, midy); 
    CGContextAddArcToPoint(context, minx, miny, midx, miny, radius); 
    CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius); 
    CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius); 
    CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius); 
    CGContextClosePath(context); 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
} 

@end 
+3

От Apple, класс UIAlertView предназначен для использования как есть и не поддерживает подклассы. Иерархия представления для этого класса является частной и не должна быть изменена. ', Вы уверены, что ваш подкласс работает правильно во всех случаях? Получили ли вы приложение, использующее этот класс, в App Store? – Daniel

+0

ЭТО ВОЗМОЖНОЕ РЕШЕНИЕ ДЛЯ ВАС. https://github.com/simonb/SBTableAlert – Anand

0

Вы должны реализовать свой UIAlertView. Вы не можете изменить синий цвет по умолчанию.

4

От UIAlertView Class Reference:

предназначен класс UIAlertView использоваться как есть и не поддерживает подклассов. Иерархия представления для этого класса является частной и ее нельзя изменять.

0

использовать UIView, чтобы показать предупреждение, вместо того, чтобы использовать UIAlertView затем изменить цвет этой точки зрения, соответственно

Смежные вопросы