Akshar A K
Akshar A K

Reputation: 412

How to change color of the UIAlertView dialog in iOS?

I have an application where I am showing an alert message using UIAlertView. By default the color of the dialog box is blue. Can anyone tell me, how to change the color of that? Can it be changed?

Upvotes: 1

Views: 13203

Answers (4)

Piyush Kashyap
Piyush Kashyap

Reputation: 1965

use a uiview to show alert instead of using UIAlertView then change the color of that view accordingly

Upvotes: 0

Anand
Anand

Reputation: 1129

Use Like This

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

.h and .m File's Content

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

Upvotes: 9

Alex Salom
Alex Salom

Reputation: 3094

From the UIAlertView Class Reference:

The UIAlertView class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified.

Upvotes: 4

Mat
Mat

Reputation: 7633

You have to implement your UIAlertView. You can't change the default blue color.

Upvotes: 0

Related Questions