Custom UIAlertView (Color chooser)

August 14, 2009 by Skylar
Filed under: iPhone Development 
PTColorChooser.png

PTColorChooser.png

In this post, I am going to show you how to make a custom UIAlertView, as seen in the above screenshots and this video. The custom UIAlertView is a color picker that is taken right out of my PocketTouch application (available on the AppStore very soon!).

To do anything custom to an alert view, we need to subclass it out. Go ahead and do so, and set up the interface for your UIAlertView like you will see in the following example.

// //  PTColorAlertView.h //  PocketTouch // //  Created by Skylar Cantu on 7/18/09. //  Copyright 2009 Skylar Cantu. All rights reserved. // #import <UIKit/UIKit.h> @interface PTColorAlertView : UIAlertView {         UISlider *redSlider;         UISlider *greenSlider;         UISlider *blueSlider;         UILabel *redLabel;         UILabel *blueLabel;         UILabel *greenLabel;         UIView *previewView; } - (void)presetSlidersWithColor:(UIColor *)color; - (void)presetSlidersWithRandomValues; - (UIColor *)getColor; @end

As you can see, I am declaring three labels, which will serve as the R, G, and B labels; three sliders, which will be used to change the actual red, green, and blue color values; and one UIView, which will serve as a color preview view.

Likewise, to get started implementing this alert, you must initialize all these objects. I manually do it all in this example, but you may want to create a helper method that will create up these objects for you.

// //  PTColorAlertView.m //  PocketTouch // //  Created by Skylar Cantu on 7/18/09. //  Copyright 2009 Skylar Cantu. All rights reserved. // #import "PTColorAlertView.h" @implementation PTColorAlertView - (id)initWithFrame:(CGRect)frame {         if (self = [super initWithFrame:frame]) {                 previewView = [[UIView alloc] initWithFrame:CGRectZero];                 previewView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];                 previewView.opaque = YES;                 redLabel = [[UILabel alloc] initWithFrame:CGRectZero];                 redLabel.backgroundColor = [UIColor clearColor];                 redLabel.text = @"R";                 redLabel.textColor = [UIColor redColor];                 redLabel.font = [UIFont systemFontOfSize:20];                 redLabel.shadowColor = [UIColor blackColor];                 redLabel.shadowOffset = CGSizeMake(0, -1);                 greenLabel = [[UILabel alloc] initWithFrame:CGRectZero];                 greenLabel.backgroundColor = [UIColor clearColor];                 greenLabel.text = @"G";                 greenLabel.textColor = [UIColor greenColor];                 greenLabel.font = [UIFont systemFontOfSize:20];                 greenLabel.shadowColor = [UIColor blackColor];                 greenLabel.shadowOffset = CGSizeMake(0, -1);                 blueLabel = [[UILabel alloc] initWithFrame:CGRectZero];                 blueLabel.backgroundColor = [UIColor clearColor];                 blueLabel.text = @"B";                 blueLabel.textColor = [UIColor blueColor];                 blueLabel.font = [UIFont systemFontOfSize:20];                 blueLabel.shadowColor = [UIColor blackColor];                 blueLabel.shadowOffset = CGSizeMake(0, -1);                 redSlider = [[UISlider alloc] initWithFrame:CGRectZero];                 [redSlider addTarget:self action:@selector(redSliderValueChanged:) forControlEvents:UIControlEventValueChanged];                 greenSlider = [[UISlider alloc] initWithFrame:CGRectZero];                 [greenSlider addTarget:self action:@selector(greenSliderValueChanged:) forControlEvents:UIControlEventValueChanged];                 blueSlider = [[UISlider alloc] initWithFrame:CGRectZero];                 [blueSlider addTarget:self action:@selector(blueSliderValueChanged:) forControlEvents:UIControlEventValueChanged];                 [self addSubview:redLabel];                 [self addSubview:greenLabel];                 [self addSubview:blueLabel];                 [self addSubview:redSlider];                 [self addSubview:greenSlider];                 [self addSubview:blueSlider];                 [self addSubview:previewView];         }         return self; }

Notice that at this point we are initializing all of our objects with a CGRectZero frame. That’s because at this point, we don’t know, or care, how large the alertview and its subviews will be. Let’s go ahead and get this thing sized up now.

As a subclass of UIView, UIAlertView has a .frame property. We will use this to our advantage and override our alertview’s -setFrame method. Setting the frame of a UIAlertView is an interesting dilemma, and another exercise in Apple thinking that they know best. They don’t.

A UIAlertView is actually an image. Trying to set the frame to another width will wither cut off the image, or cause the image to not be centered. Neither of these are ideal. The solution to the width is to use an affine transfomation. Luckily for us, we do not want to set the width. The only property that we are really concerned with is the height of the alert view.

In the iPhone API, math is done on the back end to calculate how much height you will need for your buttons, message, and title. Apple then feeds the alert view that information. By overriding -setFrame, we cut Apple’s math right out of the equation. We know that the height of our alert view is going to be 300 px. So we simply create a new rect with the width Apple provides (this will make the background image appear perfect), and the new height that we want. We call that on super (UIView) and then set the centerpoint of our alert view to the center point of the width.

- (void)setFrame:(CGRect)rect {         [super setFrame:CGRectMake(0, 0, rect.size.width, 300)];         self.center = CGPointMake(320/2, 480/2); }

See, that was easy! : )

If we were to compile right now, we will see that our buttons are right at the top, directly underneath the title. This is, of course, wrong. To fix this, and to move our labels and sliders to the correct position, we must override the alert view’s -layoutSubviews method. -layoutSubviews is a method of UIView, and as such all UIView subclasses, such as UITableViewCells (hint, hint), will inherit this method. The frameworks automatically call [someView setNeedsLayout] after setting the frame, which in turn calls the -layoutSubviews method.

The first thing we need to do is to position those buttons. They are added by Apple, so we have no natural pointer to them. To find them, we must iterate through our alert view’s subviews until we find the buttons. The buttons are a private class called UIThreePartButton. [You can find this out by outputting the "[[view class] description]” string during the for loop, there is NO PRIVATE API used here, so this is AppStore friendly!] Once we find the buttons, we simply move them to the bottom and set a variable to mark the top of the button. That variable will be the basis of the math we will use to position the preview view, labels and slider. I like to start at the button, since it is a firm landmark and solid refernce point. You may do your own maths for placement. That’s really up to you.

- (void)layoutSubviews {         CGFloat buttonTop;         for (UIView *view in self.subviews) {                 if ([[[view class] description] isEqualToString:@"UIThreePartButton"]) {                         view.frame = CGRectMake(view.frame.origin.x, self.bounds.size.height - view.frame.size.height - 15, view.frame.size.width, view.frame.size.height);                         buttonTop = view.frame.origin.y;                 }         }         buttonTop -= 7; buttonTop -= 100;         previewView.frame = CGRectMake(12, buttonTop, self.frame.size.width - 53, 100);         buttonTop -= 7; buttonTop -= 30;         blueLabel.frame = CGRectMake(12, buttonTop, self.frame.size.width - 52, 30);         blueSlider.frame = CGRectMake(blueLabel.frame.origin.x + 25, blueLabel.frame.origin.y, blueLabel.frame.size.width - 25, blueLabel.frame.size.height);         buttonTop -= 30;         greenLabel.frame = CGRectMake(12, buttonTop, self.frame.size.width - 52, 30);         greenSlider.frame = CGRectMake(greenLabel.frame.origin.x + 25, greenLabel.frame.origin.y, greenLabel.frame.size.width - 25, greenLabel.frame.size.height);         buttonTop -= 30;         redLabel.frame = CGRectMake(12, buttonTop, self.frame.size.width - 52, 30);         redSlider.frame = CGRectMake(redLabel.frame.origin.x + 25, redLabel.frame.origin.y, redLabel.frame.size.width - 25, redLabel.frame.size.height); }

Right now, all the hard parts are done. You have completed your custom UIAlertView. Congratulations. Add in a dealloc method to deallocate your objects you’ve added and you are ready to rock.

You may notice that your color preview box is just an ugly black box right now. To make it match what the user expects to see in an alert, we must put a border around it and add some shadow. I like to keep all my view drawing in the -drawRect method. -drawRect is automatically called by the frameworks with a [someView setNeedsDisplay] call, so you don’t need to worry about calling it yourself.

The first thing we want to do is call [super drawRect:rect]; That way our alert view actually gets draws. If you wanted to augment the view, or draw your own custom alert view, with a custom background, or anything else your mind can think of, this is the method to do it in.

Next, we will create a new graphics context to draw into. If we do not do that, then what we are about to draw will be drawn into our alert view instead of drawn and added to the top of our color preview view. We’ll use UIGraphicsBeginImageContext() to do that. -setNeedsDisplay is called after -setNeedsLayout, so it is safe to refer to the previewView.frame.size when creating this context.

The first thing we will want to do is set the border width and color. Use CGContextSetLineWidth() and CGContextSetRGBStrokeColor() to do so. Next, we will want to make a shadow. Three pixels looks about right. Use CGContextSetShadow() to set that. Next, use CGContextStrokeRect() to actually draw the border and CGContextGetClipBoundingBox() to contain our drawing to within our own context. It’s not 100% crucual to include CGContextGetClipBoundingBox(), but doing so will lop off the shadow that extends below the bottom border.

Once that is all set, we need to extract what we jsut drew. Fortunately, UIKit contains a convenience function to do that: UIGraphicsGetImageFromCurrentImageContext(). Treat that method as if it were a UIImage. Create an image view with it and add it as a subview of the previewView. Finally, end the context with UIGraphicsEndImageContext().

- (void)drawRect:(CGRect)rect {         [super drawRect:rect];         UIGraphicsBeginImageContext(previewView.frame.size);         CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0);         CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.9, 0.9, 1.0, 1.0);         CGContextSetShadow(UIGraphicsGetCurrentContext(), CGSizeMake(0, -3), 3.0);         CGContextStrokeRect(UIGraphicsGetCurrentContext(),      CGContextGetClipBoundingBox(UIGraphicsGetCurrentContext()));         [previewView addSubview:[[[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()] autorelease]];         UIGraphicsEndImageContext(); }

The three methods we prototyped in the interface file are very basic UIKit/CoreGraphics, so I will not go into detail.

- (void)presetSlidersWithColor:(UIColor *)color {         if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {                 const CGFloat *clr = CGColorGetComponents(color.CGColor);                 [redSlider setValue:clr[0] animated:YES];                 [greenSlider setValue:clr[0] animated:YES];                 [blueSlider setValue:clr[0] animated:YES];         } else {                 const CGFloat *clr = CGColorGetComponents(color.CGColor);                 [redSlider setValue:clr[0] animated:YES];                 [greenSlider setValue:clr[1] animated:YES];                 [blueSlider setValue:clr[2] animated:YES];         }         [self performSelector:@selector(redSliderValueChanged:) withObject:redSlider afterDelay:0.0]; } - (void)presetSlidersWithRandomValues {         srand(time(NULL));         [redSlider setValue:(float)(rand() % 100 + 1) / 100 animated:YES];         [greenSlider setValue:(float)(rand() % 100 + 1) / 100 animated:YES];         [blueSlider setValue:(float)(rand() % 100 + 1) / 100 animated:YES];         [self performSelector:@selector(redSliderValueChanged:) withObject:redSlider afterDelay:0.0]; } - (UIColor *)getColor {         return [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:blueSlider.value alpha:1.0]; }

To actually use this object within your application, you simply do something like this:

PTColorAlertView *alert = [[PTColorAlertView alloc] initWithTitle:@"Color" message:nil delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Set", nil];         [alert show];         [alert release];

You will want to make sure that you implement the UIAlertViewDelegate protocol in your containing object’s interface file. Doing so will allow you to get feed back from the custom alert view, and preset the custom alert view. for best results, implement the following two methods:

- (void)didPresentAlertView:(UIAlertView *)alertView {         [(PTColorAlertView *)alertView presetSlidersWithColor:[UIColor blueColor]];         //[(PTColorAlertView *)alertView presetSlidersWithRandomValues]; } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {         switch (buttonIndex) {                 case 0: //Cancel                         break;                 case 1: //Set                         [self doSomethingWithColor:[(PTColorAlertView *)alertView getColor]];                         break;                 default:                         break;         } }

UPDATE: For the curious, these are my slider methods within the alert view:

#pragma mark #pragma mark UISlider Methods - (void)redSliderValueChanged:(UISlider *)slider {         [UIView beginAnimations:nil context:NULL];         previewView.backgroundColor = [UIColor colorWithRed:slider.value green:greenSlider.value blue:blueSlider.value alpha:1.0];         [UIView commitAnimations]; } - (void)greenSliderValueChanged:(UISlider *)slider {         [UIView beginAnimations:nil context:NULL];         previewView.backgroundColor = [UIColor colorWithRed:redSlider.value green:slider.value blue:blueSlider.value alpha:1.0];         [UIView commitAnimations]; } - (void)blueSliderValueChanged:(UISlider *)slider {         [UIView beginAnimations:nil context:NULL];         previewView.backgroundColor = [UIColor colorWithRed:redSlider.value green:greenSlider.value blue:slider.value alpha:1.0];         [UIView commitAnimations]; }

More comments at: ipodtouchfans.com

Comments

31 Comments on Custom UIAlertView (Color chooser)

  1. ChriB on Sat, 15th Aug 2009 1:38 am
  2. Awesome post Skylar, thank you very much for this.

  3. Anthony on Sat, 15th Aug 2009 3:59 am
  4. cool well done

  5. rahulvyas on Wed, 30th Sep 2009 12:31 am
  6. it’s a great example of customizing uipickervie.nice job.you are genious…it would be great if you also add one alpha slider to it

  7. Skylar on Wed, 30th Sep 2009 12:40 am
  8. Due to the magic of -layoutSubviews, adding another slider is easy. In the init method, simply create one more slider and label. In -layoutSubviews, you’d position the slider and label exactly the same as the other sliders and labels. Copy and pasting will suffice in this case : ) Just make sure to set the height in -setFrame: to a height that is sufficient and looks good with extra slider and label.

    I use an alpha slider in PocketTouch (out soon) and I found that a white label for the “A” label looks best.

    Thanks for the compliment, and I can hope to keep offering good advice in the future!

    [WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.

  9. faisal on Sun, 1st Nov 2009 8:26 am
  10. Hi,
    i need a custom alertview which includes a ‘ progress bar’ and a cancel button.
    your tutorial help me a lot to implement a custom alert view.

    Thanks for this nice tutorial.

  11. Eric S on Thu, 5th Nov 2009 10:59 am
  12. Top notch stuff! Many many thanks!

  13. Buya on Wed, 18th Nov 2009 7:53 am
  14. Can you post the source code used in this example?

  15. Skylar on Wed, 18th Nov 2009 2:03 pm
  16. I’m not sure what you’re asking for. All the relevant source code is in this post already.

    [WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.

  17. Hasnat on Fri, 20th Nov 2009 4:53 am
  18. Thanks for uploading the video for quick view
    nice clean coding

  19. gamerman315 on Mon, 23rd Nov 2009 1:04 pm
  20. “A UIAlertView is actually an image. Trying to set the frame to another width will wither cut off the image, or cause the image to not be centered. Neither of these are ideal. The solution to the width is to use an affine transfomation.”

    I was just curious do you know how to stretch the background image you were talking about? I am trying to make a custom UIAlertView for a tutorial for this game I am making and I would like to stretch the width of the UIAlertView but as you said things will be cut off.

  21. Dan on Tue, 1st Dec 2009 8:52 pm
  22. I’m getting an EXC_BAD_ACCESS error once a button is clicked on my custom alert view, and it would seem the delegate property is nil despite initializing it with a delegate. Is it possible the call to replace self with initWithFrame is creating a new instance w/o the reference to the delegate?

  23. Skylar on Tue, 1st Dec 2009 9:31 pm
  24. To initialize this alert, you should do exactly the same thing as a standard UIAlertView. That is, -initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:;

    In this post, I supply the example PTColorAlertView *alert = [[PTColorAlertView alloc] initWithTitle:@”Color” message:nil delegate:self cancelButtonTitle:@”Cancel” otherButtonTitles:@”Set”, nil];

    What’s happening is that the standard initializer is actually being passed to the super class because we don’t subclass it. The superclass then sets the ivars and calls our subclassed -initWithFrame: as the standard UIView initializer.

    [WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.

  25. hobgoblin on Fri, 18th Dec 2009 1:15 am
  26. thanks in advance,
    but UISlider *redSlider;
    UISlider *greenSlider;
    UISlider *blueSlider;
    and the other controlls.

    is alloc in the initWithFrame ,however should they be released?

    thanks

  27. Skylar on Fri, 18th Dec 2009 1:30 am
  28. Yes, you should release those objects.

    From the post: “Right now, all the hard parts are done. You have completed your custom UIAlertView. Congratulations. Add in a dealloc method to deallocate your objects you’ve added and you are ready to rock.”

    [WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.

  29. nutsbox on Sun, 27th Dec 2009 6:51 pm
  30. This tutorial is undoubtedly very cool!

    Since I’m a newbie in iPhone programming, I wonder how can I implement this in landscape mode.

    Thank you.

  31. Hiro on Tue, 9th Feb 2010 11:27 pm
  32. Thanks for this very helpful post. I have one question though. I’m using the ASIHTTPRequest library to send data to my webserver, and you could track the progress of it by assigning a delegate of the library to a UIProgressView. I’m planning to attach the progress view to my customized alert view, but how could i pass the data from the ASIHTTPRequest from the parent / callerView to he customized Alert.

    Thanks again.

  33. Skylar on Tue, 9th Feb 2010 11:42 pm
  34. I’ve never used ASIHTTPRequest (or even know what it is), but I assume it has a .delegate property. If so, then the simplest way to accomplish your goal would be to have the parent view assign the alert view as the ASIHTTPRequest’s delegate.

    Alternatively, have your parent view create its own protocol, to which the alertview conforms. When the parent view receives feedback from the ASIHTTPRequest, simply pass the necessary imformation on to the alert view.

    I have some more information regarding protocols here: http://www.skylarcantu.com/blog/2009/08/04/protocols-made-simple/

  35. Duncan Champney on Mon, 1st Mar 2010 8:55 am
  36. Excellent post. Thanks for taking the time to write it.

    One question, though:

    In your alert’s -drawRect method, why do you go to the work to set up a graphics context and draw into it to create an image?

    If I were doing this, I would create a custom subclass of UIView, ColorBoxView, that had a UIColor property, and do my drawing in that view’s 0drawRect method. I would then add this view to my alert in my -initWithFrame method, and add the logic to calculate the size and position of my new ColorBoxView in the -layoutSubviews method

    That way, my subclass of UIView would get -drawRect calls to draw itself, and the drawing context would be set up for me. All I would have to do is use Cocoa drawing calls to draw my frame, shadow, and fill color.

    I would think that would be simpler. Am I missing something?

    Regards,

    Duncan C

  37. Skylar on Mon, 1st Mar 2010 2:09 pm
  38. If you look, the only thing my -drawRect: method does, after UIKit draws the UIAlertView, is create the outline and the shadow. Having those as a separate view over the view that you’re actually coloring saves the device a lot of calculations. If you’re drawing a shadow and an outline directly in your ColorBoxView, then the device has to calculate the result of adding shadow to the color each time the color changes. Set up how this post’s example is, all you are doing is changing the background color of a UIView, with no added calculations required. The transparent image with the shadowing and outline remains the same throughout.

    As for creating a new context into which I draw the image, it is the easiest way to draw a new image as a new view without creating a new UIView subclass. If I used the current -drawRect: context (UIGraphicsGetCurrentContext()) without first creating a new context into which to draw, the shadow and outline would have been blocked by the color view. This left me with the only option of having the drawing be in another view which is pasted above the color view. I could have created a new UIView subclass which would draw the border and shadow, or I could have continued drawing in the UIAlertView’s -drawRect: method. The latter is the far simpler method, in my opinion. All I had to do was quickly create a new image context, draw into it, extract the drawing, and paste that on top of the color view in a UIImageView.

    Slightly more memory is used this way, but I feel it is the better performer.

  39. Erwin Panganiban on Wed, 3rd Mar 2010 7:28 am
  40. Very nice post, I’m sorry if my question is already answered in your post.
    But, what i wanted to know is how to custom UIAlertView by changing the overlay
    background, and buttons to an image file? If this is possible, can i use the menuItem method to set an image for normal and selected state?

    Thanks a lot

    Erwin

  41. Sascha on Wed, 14th Apr 2010 2:21 am
  42. Hi.
    Nice work.

    I have more than 2 buttons in my alert. How can I tell them to not be all in one row ?

  43. fast on Sat, 1st May 2010 1:32 pm
  44. can you upload the project file?

  45. fast on Sat, 1st May 2010 1:33 pm
  46. and do a tutorial for add a uiimageview in a uialertview

  47. Skylar on Sat, 1st May 2010 8:02 pm
  48. Fast, considering I pulled this out of an actual AppStore app that I made ( http://download.pockettouch.net ), I have no shareable project files. However, all the relevant code is available in this post.

    As far as adding a UIImage goes, that’s simple. You’d add the UIImage the same way that you’d add the previewView in the above sample. However, if I were making an image view alert view, I’d create it as a new object, a UIImageAlertView or UIImageViewAlertView, whichever makes more sense. I’d use change the init method to be something more like
    -initWithTitle:message:image:delegate:cancelButtonTitle:otherButtonTitles:

    I’d have that initialization method set a image property of the alert view subclass. I’d override the property setter to have the method set the image as ivar and also calculate the height and width of the image which would be set as separate properties. The image property, of course, would be so that you can change the image at any point without having to destroy the alert and create a new one.

    During the -layoutSubviews method, simply refer to the stored image height and width to set the size of the UIImageView. And, in -drawRect:, go ahead and set the image to the UIImageView’s .image property.

  49. pierre on Sun, 20th Jun 2010 7:42 am
  50. Thanks for the above, what an eye opener.
    I want to add an uilertview into my popover in my iPad app.
    currently the uialertview screen appear into the center of the screen, my popover is on the left hand side corner
    thanks

  51. AustinLee on Fri, 25th Jun 2010 10:28 pm
  52. this is really great, I did as what you said, but when the alert view shows up again, the button goes back to its original position, do you know why? you can check the picture in my blog: http://disordertomorrow.blogspot.com/2010/06/wired-thing-after-adding-subview-to.html

  53. Skylar on Fri, 25th Jun 2010 11:17 pm
  54. AustinLee, without seeing code, I can’t say for certain what is causing your problem. It seems to me that instead of destroying each alert after use, you are reusing the same alert. If this is the case, then you can throw a -[setNeedsLayout] call wherever appropriate in your code. However, you should be creating a new alert each time.

    Of course, my diagnosis may be wrong, which is why this would be tough to diagnose with just a screenshot.

    When I needed to create a UIAlertView with a text field, I subclassed UIAlertView into a new object called UITextFieldAlert. This object behaved the same as UIAlertview except it had the addition of an text field, and the ability to set an object as the delegate of the text field.

    You can see the code for UITextFieldAlert in action by compiling the source code here: http://github.com/SkylarEC/ConnectSome It should compile without warnings errors or leaks. If you find any, please let me know. To know what I’m doing, take a look at the code. The code for usage of the UITextFieldAlert object is located in UIDualTablesView.

    Videos of the app throughout various stages of its creation are available at http://www.skylarcantu.com/videos/CSPreview/

  55. AustinLee on Sun, 27th Jun 2010 6:31 am
  56. Hi Skylar, thanks very much, I’ll check the code you provided, and also I’ve posted my code to my blog, if you have time, could help to check it? thanks again.

  57. ansonlogz on Tue, 29th Jun 2010 2:16 am
  58. I embedded uitextview into uialertview,but it didn’t work in SDK4,nothing can input to the uitextview. I don’t know what’s wrong?

  59. Sahil Goenka on Thu, 8th Jul 2010 1:04 pm
  60. how can i set the frame of uialert withoust using custom alert method

  61. fgerike on Thu, 22nd Jul 2010 8:44 am
  62. Hy!
    I’m a beginner, so what is the correct code for”doSomethingWithColor”?

    I want to change the uiview color.

    Thank you for help!

Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!





Powered by WP Hashcash