Programatically change custom UiButton background color - ios

Within my custom UIButton class called "ComingHomeButton", I'm not able to change the backgroundcolor
I would like to change it without creating images, but if it is the only way I will have to.
I also want to change the background color every time the button is tapped.
Here is what I have that doesnt work:
UIColor *color = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.5];
[self setBackgroundColor:color];
self refers to my "ComingHomeButton"
Thank you so much :-)

You can create a counter, and then loop through colors when a button is tapped:
-(IBAction)buttonTapped:(id)sender {
if (!counter) {
counter = 0
}
if (counter%3 == 0) {
self.backgroundColor = [UIColor redColor]; //or whatever custom color you want to use
} else if (counter%3 == 1) {
self.backgroundColor = [UIColor blueColor];
} else if (counter%3 == 2) {
self.backgroundColor = [UIColor greenColor];
}
counter++
}
and you can add as many colors as you want to loop through. The % denotes the mod function, making sure that when counter is bigger than 2, it will still return a number between 0 and 2.
The number after the % is the number of colors to loop through.

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 300, 100)];
btn.backgroundColor = [UIColor blueColor];
[self.view addSubview:btn];
The following code works fine for adding a button the a given view with a background button. Try using the dot notation instead of the message pass.

-(IBAction)buttonTapped:(id)sender {
sender.backgroundColor = [self randomColor];
}
-(UIColor *)randomColor
{
CGFloat red = arc4random() % 255 / 255.0;
CGFloat green= arc4random() % 255 / 255.0;
CGFloat blue= arc4random() % 255 / 255.0;
UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];
return color;
}
I did not test the code I am not on my mac but it should work.

Related

Sometimes category method return nil after UIImagePickerController

I use simple UIColor category for random color.
+ (UIColor *)randomColor {
return [UIColor colorWithRed:arc4random_uniform(255)/255.0
green:arc4random_uniform(255)/255.0
blue:arc4random_uniform(255)/255.0
alpha:1.0];
}
And I tested this code in viewDidAppear: method.
Method method = class_getClassMethod([UIColor class], #selector(randomColor));
NSLog(#"color=%#, method=%d", [UIColor randomColor], (method != NULL));
UIColor * color = [UIColor colorWithRed:arc4random_uniform(255)/255.0
green:arc4random_uniform(255)/255.0
blue:arc4random_uniform(255)/255.0
alpha:1.0];
NSLog(#"color=%#", color);
First time when viewC did appear, it works very well.
color=UIDeviceRGBColorSpace 0.0509804 0.0862745 0.160784 1, method=1
color=UIDeviceRGBColorSpace 0.784314 0.509804 0.964706 1
But after I present UIPickerImageController and cancel it,
it shows different result.
color=(null), method=1
color=UIDeviceRGBColorSpace 0.254902 0.576471 0.937255 1
Why this situation happen?
It is really weird. :(

iOS 7 UIButton alignment

I'm trying to make custom badge. For that I make subclass of UIButton and remake - (void)drawRect:(CGRect)rect like this:
- (void)drawRect:(CGRect)rect
{
self.titleLabel.font = [UIFont systemFontOfSize:12];
[self setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
self.userInteractionEnabled = NO;
self.layer.borderWidth = 1.5f;
self.layer.cornerRadius = rect.size.width / 2;
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [[UIScreen mainScreen] scale];
self.layer.backgroundColor = [UIColor grayColor].CGColor;
self.layer.borderColor = [UIColor grayColor].CGColor;
}
And everything is good except alignment. It is a little upper than it should be. Looks like this:
What to do?
#property(nonatomic) NSTextAlignment textAlignment;
// default is NSTextAlignmentLeft
It's an attribute of UILabel.
Here is badge I need: https://github.com/jessesquires/JSCustomBadge . Works perfect!

Draw a line between two points - How to pass UIView

I am trying to draw a simple line connecting two points. I think i got the right code for that in my drawLine method. No lines appear at all and I am pretty sure it has to do with the View I am calling with and the one I want to draw on. The following code is where I build my next View in code (data coming from a web service). The View gets created just fine and all buttons and objects appear.
I am trying to add lines to the View I'm creating (Next) dynamically and not sure how to get that done. From the Errors I get (invalid context 0x0) it seems I am doing something out of order. Trying to display on a view that is not there. how than can I get this done? Any advice would be appreciated.
I realize that passing on the View might not be the right answer. I am in the midst of trial and error here.
To clarify: I am calling drawLine here:
[nextView.view addSubview:next];
Thanks,
Shai
-(void) drawView
{
CGRect rec;
CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat height = [UIScreen mainScreen].bounds.size.height;
UIView *next = [[UIView alloc]initWithFrame:CGRectMake(0, 0, height, width)];
next.backgroundColor = [UIColor whiteColor];
next.userInteractionEnabled = YES;
next.multipleTouchEnabled = YES;
nextView = [UIViewController alloc];
[nextView setTitle: as_objectDesc];
for (object in viewObjects)
{ // ratio based on Ipad 2 screen size conversion from the Datawindow size - alter to support other device
CGFloat objWidth = object.Width/3.83;
CGFloat objHeight = object.Height/2.78;
CGFloat objXPoint = object.positionX/3.83;
CGFloat objYPoint = object.positionY/2.78;
if ([object.Shape isEqualToString:#"text"])
{
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
UILabel *myLabel = [[UILabel alloc] initWithFrame:rec];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.text = object.objectTag;
myLabel.lineBreakMode = NSLineBreakByWordWrapping;
if ([object.description isEqualToString:#"Header"])
{
myLabel.font = [UIFont systemFontOfSize:20];
}
else
{
myLabel.font = [UIFont systemFontOfSize:10];
}
[next addSubview:myLabel];
}
else if ([object.Shape isEqualToString:#"line"])
{
**[self drawLine:nextView.view];**
}
else
{
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
if ([object.Shape isEqualToString:#"ellipse"])
{
UIImage * buttonImage;
if ([object.Color isEqualToString:#"255"])
{
buttonImage = [UIImage imageNamed:#"redBackground.png"];
}
else if ([object.Color isEqualToString:#"65535"])
{
buttonImage = [UIImage imageNamed:#"yellowBackground.png"];
}
else if ([object.Color isEqualToString:#"GRAY"])
{
buttonImage = [UIImage imageNamed:#"graybground.PNG"];
}
else if ([object.Color isEqualToString:#"BLACK"])
{
buttonImage = [UIImage imageNamed:#"BlackBackground.png"];
}
[myButton setBackgroundImage:buttonImage forState: UIControlStateNormal];
objWidth = objHeight;
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
myButton.frame = rec;
myButton.clipsToBounds = YES;
myButton.layer.cornerRadius = objWidth/2;
}
else
{
rec = CGRectMake(objXPoint, objYPoint, objWidth, objHeight);
if ([object.Color isEqualToString:#"255"])
myButton.backgroundColor = [UIColor redColor];
else if ([object.Color isEqualToString:#"65535"])
myButton.backgroundColor = [UIColor yellowColor];
else if ([object.Color isEqualToString:#"GRAY"])
myButton.backgroundColor = [UIColor grayColor];
else if ([object.Color isEqualToString:#"BLACK"])
myButton.backgroundColor = [UIColor blackColor];
}
[[myButton layer] setBorderWidth:1.0f];
[[myButton layer] setBorderColor:[UIColor blackColor].CGColor];
myButton.enabled = YES;
myButton.accessibilityHint = object.objectTag;
myButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
myButton.titleLabel.textAlignment = NSTextAlignmentCenter;
myButton.titleLabel.font = [UIFont systemFontOfSize:13];
[myButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[myButton addTarget:self action:#selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
myButton.frame = rec;
[myButton setTitle:object.description forState:UIControlStateNormal];
// Check if an Empty Rectangle
NSRange test =[myButton.accessibilityHint rangeOfString:#"r_"];
if (test.location == 0)
{
[next sendSubviewToBack:myButton];
[myButton setEnabled:NO];
}
[next addSubview:myButton];
}
UIPinchGestureRecognizer *twoFingerPinch = [[UIPinchGestureRecognizer alloc]
initWithTarget:self
action:#selector(twoFingerPinch:)]
;
[[nextView view] addGestureRecognizer:twoFingerPinch];
[next addSubview:activityIndicator];
[next bringSubviewToFront:activityIndicator];
}
[nextView.view addSubview:next];
[self dismissViewControllerAnimated:NO completion:nil];
[self.navigationController pushViewController:nextView animated:NO];
}
- (void)drawLine:(UIView *) view
{
CGFloat x1 = object.positionX;
CGFloat y1 = object.positionY;
CGFloat x2 = object.positionX2;
CGFloat y2 = object.positionY2;
CGContextRef context = UIGraphicsGetCurrentContext();
if ([object.Color isEqualToString:#"255"])
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
else if ([object.Color isEqualToString:#"65535"])
CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
else if ([object.Color isEqualToString:#"GRAY"])
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
else if ([object.Color isEqualToString:#"BLACK"])
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
CGContextSetLineWidth(context, 3.0);
CGContextBeginPath(context);
CGContextMoveToPoint(context, x1, y1);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);
}
I end up figuring this up days a go and thought I would share here. I might have added to much code in my question which did not help to simplify it to others (no comments).
What this came down to is when trying to Draw a line you need to override the DrawRect Method of the UIView subclass and not the UIViewController as I did. There is no Error thrown if you call DrawRect from your UIViewController but it doesn't do anything. I missed that small detail.
What added to the complexity of finding this out ans solving this was that I was creating all of it Programmatically and initially didn't subclass UIView at all. I ended up adding all the Points in an NSMutablearray and redrawing the lines in the following class after the newly View got created:
#import "draw.h"
#implementation draw
#synthesize lines;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// Initialization code
}
return self;
}
-(void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
for (line *myLine in lines)
{
if ([myLine.color isEqualToString:#"255"])
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
else if ([myLine.color isEqualToString:#"65535"])
CGContextSetStrokeColorWithColor(context, [UIColor yellowColor].CGColor);
else if ([myLine.color isEqualToString:#"GRAY"])
CGContextSetStrokeColorWithColor(context, [UIColor grayColor].CGColor);
else if ([myLine.color isEqualToString:#"BLACK"])
CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
int setNew = myLine.Width/4;
CGContextSetLineWidth(context, (CGFloat)setNew);
CGContextBeginPath(context);
CGContextMoveToPoint(context, myLine.x1, myLine.y1);
CGContextAddLineToPoint(context, myLine.x2, myLine.y2);
CGContextStrokePath(context);
}
}
#end

Add shadow to frame of UITextView add also shadow to text

I have a UITextView where I add some drop shadow to the frame, but when I write, the text got also the same shadow. How to avoid this problem?
My code :
commentary = [[UITextView alloc]initWithFrame:CGRectMake(10, 435, 230, 120)];
commentary.font = STANDARDFONT;
commentary.backgroundColor = BACKGROUND;
commentary.layer.shadowColor = [UIColor blackColor].CGColor;
commentary.layer.shadowOffset = CGSizeMake(2, 2);
commentary.layer.shadowOpacity = 0.8;
commentary.layer.shadowRadius = 2.0;
commentary.layer.borderColor = [UIColor grayColor].CGColor;
commentary.layer.borderWidth = 1.5;
commentary.layer.cornerRadius = 5;
commentary.layer.masksToBounds = NO;
commentary.clipsToBounds = NO;
[self addSubview:commentary];
BACKGROUND and STANDARDFONT is [UICOLOR clearColor].CGColorand [UIFont fontWithName:#"TimesNewRomanPSMT" size:16];
Try setting the layer background color also: commentary.layer.backgroundColor = BACKGROUND.CGColor

Issue with [UIColor getWhite:alpha:]

I'm trying to use get the white value of a UIColor by the following (redColor is just for example):
UIColor *col = [UIColor redColor];
CGFloat *white;
if([col getWhite:white alpha:nil])
{
NSLog(#"worked");
}
else
{
NSLog(#"didn't");
}
But this always prints "didn't", and I don't understand why. UIColor.h's definition says "If the receiver is of a compatible color space, any non-NULL parameters are populated and 'YES' is returned. Otherwise, the parameters are left unchanged and 'NO' is returned." so I'm presuming that the receiver is of a non-compatible color space.... But I don't know what that means. Any ideas?
You are passing a pointer to a random piece of memory (CGFloat *white;)
You should create a static CGFloat and pass a reference to it
UIColor *col = [UIColor redColor];
CGFloat white;
if([col getWhite:&white alpha:nil])
{
NSLog(#"worked");
}
else
{
NSLog(#"didn't");
}
It is possible that it will not be able to convert from grayscale, you can check by trying
UIColor *col = [UIColor colorWithWhite:1.0 alpha:1.0];
CGFloat white;
if([col getWhite:&white alpha:nil])
{
NSLog(#"worked");
}
else
{
NSLog(#"didn't");
}

Resources