2012-03-30 92 views
1

我有一个应用程序,我使用UIAlertView显示警报消息。默认情况下,对话框的颜色为蓝色。谁能告诉我,如何改变颜色?它可以改变吗?如何更改iOS中UIAlertView对话框的颜色?

+1

围棋的颜色警报:http://stackoverflow.com /Items/883208/change-the- background-color-of-a-uialertview – 2012-03-30 09:26:54

回答

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

从苹果方面说,“UIAlertView类旨在按原样使用,不支持子类。这个类的视图层次结构是私有的,不能修改.',你确定你的子类在所有情况下都能正常工作吗?你有没有在App Store上使用这个类的应用程序? – Daniel 2012-12-03 04:26:36

+0

这是您可能的解决方案。 https://github.com/simonb/SBTableAlert – Anand 2013-02-02 05:08:12

0

您必须执行您的UIAlertView。您不能更改默认的蓝色。

4

UIAlertView Class Reference

的UIAlertView中类旨在被原样使用,并且不支持子类。该类的视图层次结构是私有的,不能修改。

0

使用一个UIView来显示,而不是使用然后UIAlertView中通过这个[先前所讨论的问题] [1] [1]改变视图相应