如何创建一个渐变背景色的按钮

通过 NVUIGradientButton 类来实现,作者: Nicolas Verinaud

 1 //
 2 //  NVUIGradientButton.h
 3 //
 4 //  Created by Nicolas Verinaud on 20/06/12.
 5 //  Copyright (c) 2012 nverinaud.com. All rights reserved.
 6 //
 7 
 8 #import <UIKit/UIKit.h>
 9 
10 typedef enum {
11     NVUIGradientButtonStyleDefault = 1,
12     NVUIGradientButtonStyleBlackOpaque,
13     NVUIGradientButtonStyleBlackTranslucent
14 } NVUIGradientButtonStyle;
15 
16 
17 @interface NVUIGradientButton : UIControl
18 
19 @property (nonatomic, assign) NVUIGradientButtonStyle style;
20 //角度半径
21 @property (nonatomic) CGFloat cornerRadius; // Default to 10.0
22 //边宽
23 @property (nonatomic) CGFloat borderWidth; // Default to 2.0
24 //填充颜色
25 @property (strong, nonatomic) UIColor *tintColor; // Default to gray
26 //高亮时填充颜色
27 @property (strong, nonatomic) UIColor *highlightedTintColor; // Default to nice blue
28 //边框颜色
29 @property (strong, nonatomic) UIColor *borderColor; // Default to darkGray
30 //高亮时边框颜色
31 @property (strong, nonatomic) UIColor *highlightedBorderColor; // Default to white
32 //字体颜色
33 @property (strong, nonatomic) UIColor *textColor; // Default to black
34 //高亮时字体颜色
35 @property (strong, nonatomic) UIColor *highlightedTextColor; // Default to white
36 //字体阴影颜色
37 @property (strong, nonatomic) UIColor *textShadowColor; // Default to clear
38 //高亮时字体阴影颜色
39 @property (strong, nonatomic) UIColor *highlightedTextShadowColor; // Default to darkGrey
40 //内容文字
41 @property (copy, nonatomic) NSString *text;
42 //高亮时内容文字
43 @property (copy, nonatomic) NSString *highlightedText; // Default to text
44 //设置disabled状态颜色
45 @property (copy, nonatomic) NSString *disabledText; // Default to text
46 //字所在的label
47 @property (strong, nonatomic, readonly) UILabel *titleLabel;
48 //设置YES渐变色,设置NO单色
49 @property (nonatomic, getter = isGradientEnabled) BOOL gradientEnabled; // Default to YES, set to NO to draw flat color
50 //rightAccessory图片
51 @property (nonatomic, strong) UIImage *rightAccessoryImage;
52 //高亮时rightAccessory图片
53 @property (nonatomic, strong) UIImage *rightHighlightedAccessoryImage;
54 
55 //三种初始化便利方式
56 // Designated initializer
57 - (id)initWithFrame:(CGRect)frame style:(NVUIGradientButtonStyle)style cornerRadius:(CGFloat)cornerRadius borderWidth:(CGFloat)borderWidth andText:(NSString *)text;
58 // Convenient initializers
59 - (id)initWithFrame:(CGRect)frame cornerRadius:(CGFloat)cornerRadius borderWidth:(CGFloat)borderWidth andText:(NSString *)text;
60 - (id)initWithFrame:(CGRect)frame style:(NVUIGradientButtonStyle)style;
61 
62 // Convenience for configuration depending on states
63 //填充颜色
64 - (void)setTintColor:(UIColor *)tintColor forState:(UIControlState)state;
65 //边颜色
66 - (void)setBorderColor:(UIColor *)borderColor forState:(UIControlState)state;
67 //字颜色
68 - (void)setTextColor:(UIColor *)textColor forState:(UIControlState)state;
69 //字阴影颜色
70 - (void)setTextShadowColor:(UIColor *)textShadowColor forState:(UIControlState)state;
71 //文字
72 - (void)setText:(NSString *)text forState:(UIControlState)state;
73 //RightAccessory
74 - (void)setRightAccessoryImage:(UIImage *)rightAccessoryImage forState:(UIControlState)state;
75 
76 @end
View Code
  1 //
  2 //  NVUIGradientButton.m
  3 //
  4 //  Created by Nicolas Verinaud on 20/06/12.
  5 //  Copyright (c) 2012 nverinaud.com. All rights reserved.
  6 //
  7 
  8 #import "NVUIGradientButton.h"
  9 
 10 @interface NVUIGradientButton ()
 11 - (void)performDefaultInit;
 12 - (void)updateAccordingToStyle;
 13 - (BOOL)isHighlightedOrSelected;
 14 - (UIColor *)tintColorAccordingToCurrentState;
 15 - (UIColor *)borderColorAccordingToCurrentState;
 16 - (UIColor *)textColorAccordingToCurrentState;
 17 - (UIColor *)textShadowColorAccordingToCurrentState;
 18 - (NSString *)textAccordingToCurrentState;
 19 - (UIImage *)rightAccessoryImageAccordingToCurrentState;
 20 - (CGGradientRef)newGradientAccordingToCurrentState;
 21 @property (strong, nonatomic, readwrite) UILabel *titleLabel;
 22 @end
 23 
 24 
 25 @implementation NVUIGradientButton
 26 
 27 #pragma mark - Creation
 28 
 29 #define NVUIGradientButtonDefaultCorderRadius    10.0
 30 #define NVUIGradientButtonDefaultBorderWidth    2.0
 31 
 32 - (void)performDefaultInit
 33 {
 34     // Defaults
 35     _highlightedText = _text;
 36     _disabledText = _text;
 37     
 38     // Label
 39     _titleLabel = [[UILabel alloc] init];
 40     _titleLabel.textAlignment = UITextAlignmentCenter;
 41     _titleLabel.lineBreakMode = UILineBreakModeMiddleTruncation;
 42     _titleLabel.numberOfLines = 0;
 43     _titleLabel.font = [UIFont boldSystemFontOfSize:15.0];
 44     _titleLabel.minimumFontSize = 12.0;
 45     _titleLabel.shadowOffset = CGSizeMake(0, -1);
 46     
 47     _gradientEnabled = YES;
 48     
 49     self.opaque = NO;
 50     self.backgroundColor = [UIColor clearColor];
 51 }
 52 
 53 
 54 - (void)updateAccordingToStyle
 55 {
 56     switch (_style)
 57     {
 58         case NVUIGradientButtonStyleBlackOpaque:
 59         {
 60             self.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
 61             self.highlightedTintColor = [UIColor colorWithRed:(CGFloat)3/255 green:(CGFloat)112/255 blue:(CGFloat)236/255 alpha:1];
 62             self.borderColor = [UIColor whiteColor];
 63             self.highlightedBorderColor = [UIColor whiteColor];
 64             self.textColor = [UIColor whiteColor];
 65             self.highlightedTextColor = [UIColor whiteColor];
 66             self.textShadowColor = [UIColor clearColor];
 67             self.highlightedTextShadowColor = [UIColor clearColor];
 68             break;
 69         }
 70             
 71         case NVUIGradientButtonStyleBlackTranslucent:
 72         {
 73             self.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.7];
 74             self.highlightedTintColor = [UIColor colorWithRed:(CGFloat)3/255 green:(CGFloat)112/255 blue:(CGFloat)236/255 alpha:0.7];
 75             self.borderColor = [UIColor whiteColor];
 76             self.highlightedBorderColor = [UIColor whiteColor];
 77             self.textColor = [UIColor whiteColor];
 78             self.highlightedTextColor = [UIColor whiteColor];
 79             self.textShadowColor = [UIColor clearColor];
 80             self.highlightedTextShadowColor = [UIColor clearColor];
 81             break;
 82         }
 83             
 84         case NVUIGradientButtonStyleDefault:
 85         {
 86             CGFloat gray = 220.0/255.0;
 87             self.tintColor = [UIColor colorWithRed:gray green:gray blue:gray alpha:1];
 88             self.highlightedTintColor = [UIColor colorWithRed:0 green:(CGFloat)157/255 blue:1 alpha:1];
 89             self.borderColor = [UIColor darkGrayColor];
 90             self.highlightedBorderColor = [UIColor whiteColor];
 91             self.textColor = [UIColor blackColor];
 92             self.highlightedTextColor = [UIColor whiteColor];
 93             self.textShadowColor = [UIColor clearColor];
 94             self.highlightedTextShadowColor = [UIColor darkGrayColor];
 95             break;
 96         }
 97     }
 98 }
 99 
100 #pragma mark Designated initializer
101 
102 - (id)initWithFrame:(CGRect)frame style:(NVUIGradientButtonStyle)style cornerRadius:(CGFloat)cornerRadius borderWidth:(CGFloat)borderWidth andText:(NSString *)text
103 {
104     self = [super initWithFrame:frame];
105     if (self)
106     {
107         _cornerRadius = cornerRadius;
108         _borderWidth = borderWidth;
109         _text = text;
110         
111         [self performDefaultInit];
112         
113         self.style = style;
114     }
115     return self;
116 }
117 
118 
119 #pragma mark Convenient initializers
120 
121 - (id)initWithFrame:(CGRect)frame cornerRadius:(CGFloat)cornerRadius borderWidth:(CGFloat)borderWidth andText:(NSString *)text
122 {
123     return [self initWithFrame:frame style:NVUIGradientButtonStyleDefault cornerRadius:cornerRadius borderWidth:borderWidth andText:text];
124 }
125 
126 
127 - (id)initWithFrame:(CGRect)frame style:(NVUIGradientButtonStyle)style
128 {
129     return [self initWithFrame:frame style:style cornerRadius:NVUIGradientButtonDefaultCorderRadius borderWidth:NVUIGradientButtonDefaultBorderWidth andText:nil];
130 }
131 
132 #pragma mark Overriden initializers
133 
134 - (id)initWithFrame:(CGRect)frame
135 {
136     return [self initWithFrame:frame style:NVUIGradientButtonStyleDefault cornerRadius:NVUIGradientButtonDefaultCorderRadius borderWidth:NVUIGradientButtonDefaultBorderWidth andText:nil];
137 }
138 
139 
140 - (id)initWithCoder:(NSCoder *)aDecoder
141 {
142     self = [super initWithCoder:aDecoder];
143     if (self)
144     {
145         _cornerRadius = NVUIGradientButtonDefaultCorderRadius;
146         _borderWidth = NVUIGradientButtonDefaultBorderWidth;
147         
148         [self performDefaultInit];
149         
150         self.style = NVUIGradientButtonStyleDefault;
151     }
152     return self;
153 }
154 
155 
156 #pragma mark - Setters
157 
158 - (void)setStyle:(NVUIGradientButtonStyle)style
159 {
160     if (style != _style)
161     {
162         _style = style;
163         [self updateAccordingToStyle];
164     }
165 }
166 
167 
168 - (void)setTintColor:(UIColor *)tintColor
169 {
170     if (tintColor != _tintColor)
171     {
172         _tintColor = tintColor;
173         
174         if (self.state == UIControlStateNormal)
175             [self setNeedsDisplay];
176     }
177 }
178 
179 
180 - (void)setHighlightedTintColor:(UIColor *)highlightedTintColor
181 {
182     if (highlightedTintColor != _highlightedTintColor)
183     {
184         _highlightedTintColor = highlightedTintColor;
185         
186         if ([self isHighlightedOrSelected])
187             [self setNeedsDisplay];
188     }
189 }
190 
191 
192 - (void)setBorderColor:(UIColor *)borderColor
193 {
194     if (borderColor != _borderColor)
195     {
196         _borderColor = borderColor;
197         
198         if (self.state == UIControlStateNormal)
199             [self setNeedsDisplay];
200     }
201 }
202 
203 
204 - (void)setHighlightedBorderColor:(UIColor *)highlightedBorderColor
205 {
206     if (highlightedBorderColor != _highlightedBorderColor)
207     {
208         _highlightedBorderColor = highlightedBorderColor;
209         
210         if ([self isHighlightedOrSelected])
211             [self setNeedsDisplay];
212     }
213 }
214 
215 
216 - (void)setTextColor:(UIColor *)textColor
217 {
218     if (textColor != _textColor)
219     {
220         _textColor = textColor;
221         
222         if (self.state == UIControlStateNormal)
223             [self setNeedsDisplay];
224     }
225 }
226 
227 
228 - (void)setHighlightedTextColor:(UIColor *)highlightedTextColor
229 {
230     if (highlightedTextColor != _highlightedTextColor)
231     {
232         _highlightedTextColor = highlightedTextColor;
233         
234         if ([self isHighlightedOrSelected])
235             [self setNeedsDisplay];
236     }
237 }
238 
239 
240 - (void)setTextShadowColor:(UIColor *)textShadowColor
241 {
242     if (textShadowColor != _textShadowColor)
243     {
244         _textShadowColor = textShadowColor;
245         
246         if (self.state == UIControlStateNormal)
247             [self setNeedsDisplay];
248     }
249 }
250 
251 
252 - (void)setHighlightedTextShadowColor:(UIColor *)highlightedTextShadowColor
253 {
254     if (highlightedTextShadowColor != _highlightedTextShadowColor)
255     {
256         _highlightedTextShadowColor = highlightedTextShadowColor;
257         
258         if ([self isHighlightedOrSelected])
259             [self setNeedsDisplay];
260     }
261 }
262 
263 
264 - (void)setText:(NSString *)text
265 {
266     if (![text isEqualToString:_text])
267     {
268         _text = text;
269         
270         if (self.state == UIControlStateNormal)
271             [self setNeedsDisplay];
272     }
273 }
274 
275 
276 - (void)setHighlightedText:(NSString *)highlightedText
277 {
278     if (![highlightedText isEqualToString:_highlightedText])
279     {
280         _highlightedText = highlightedText;
281         
282         if ([self isHighlightedOrSelected])
283             [self setNeedsDisplay];
284     }
285 }
286 
287 
288 - (void)setDisabledText:(NSString *)disabledText
289 {
290     if (![disabledText isEqualToString:_disabledText])
291     {
292         _disabledText = disabledText;
293         
294         if (self.state & UIControlStateDisabled)
295             [self setNeedsDisplay];
296     }
297 }
298 
299 
300 - (void)setRightAccessoryImage:(UIImage *)rightAccessoryImage
301 {
302     if (rightAccessoryImage != _rightAccessoryImage)
303     {
304         _rightAccessoryImage = rightAccessoryImage;
305         
306         if (self.state == UIControlStateNormal)
307             [self setNeedsDisplay];
308     }
309 }
310 
311 
312 - (void)setRightHighlightedAccessoryImage:(UIImage *)rightHighlightedAccessoryImage
313 {
314     if (rightHighlightedAccessoryImage != _rightHighlightedAccessoryImage)
315     {
316         _rightHighlightedAccessoryImage = rightHighlightedAccessoryImage;
317         
318         if ([self isHighlightedOrSelected])
319             [self setNeedsDisplay];
320     }
321 }
322 
323 
324 #pragma mark - Convenience configuration for states
325 
326 - (BOOL)isHighlightedOrSelected
327 {
328     return (self.state & UIControlStateHighlighted || self.state & UIControlStateSelected);
329 }
330 
331 
332 - (void)setTintColor:(UIColor *)tintColor forState:(UIControlState)state
333 {
334     if (state == UIControlStateNormal)
335         self.tintColor = tintColor;
336     
337     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
338         self.highlightedTintColor = tintColor;
339 }
340 
341 
342 - (void)setBorderColor:(UIColor *)borderColor forState:(UIControlState)state
343 {
344     if (state == UIControlStateNormal)
345         self.borderColor = borderColor;
346     
347     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
348         self.highlightedBorderColor = borderColor;
349 }
350 
351 
352 - (void)setTextColor:(UIColor *)textColor forState:(UIControlState)state
353 {
354     if (state == UIControlStateNormal)
355         self.textColor = textColor;
356     
357     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
358         self.highlightedTextColor = textColor;
359 }
360 
361 
362 - (void)setTextShadowColor:(UIColor *)textShadowColor forState:(UIControlState)state
363 {
364     if (state == UIControlStateNormal)
365         self.textShadowColor = textShadowColor;
366     
367     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
368         self.highlightedTextShadowColor = textShadowColor;
369 }
370 
371 
372 - (void)setText:(NSString *)text forState:(UIControlState)state
373 {
374     if (state == UIControlStateNormal)
375         self.text = text;
376     
377     if (state & UIControlStateDisabled)
378         self.disabledText = text;
379     
380     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
381         self.highlightedText = text;
382 }
383 
384 
385 - (void)setRightAccessoryImage:(UIImage *)rightAccessoryImage forState:(UIControlState)state
386 {
387     if (state == UIControlStateNormal)
388         self.rightAccessoryImage = rightAccessoryImage;
389     
390     if (state & UIControlStateHighlighted || state & UIControlStateSelected)
391         self.rightHighlightedAccessoryImage = rightAccessoryImage;
392 }
393 
394 
395 - (UIColor *)tintColorAccordingToCurrentState
396 {
397     UIColor *tintColor = _tintColor;
398     
399     if([self isHighlightedOrSelected])
400         tintColor = _highlightedTintColor;
401     
402     return tintColor;
403 }
404 
405 
406 - (UIColor *)borderColorAccordingToCurrentState
407 {
408     UIColor *borderColor = _borderColor;
409     
410     if ([self isHighlightedOrSelected] && _highlightedBorderColor)
411         borderColor = _highlightedBorderColor;
412     
413     return borderColor;
414 }
415 
416 
417 - (UIColor *)textColorAccordingToCurrentState
418 {
419     UIColor *textColor = _textColor;
420     
421     if ([self isHighlightedOrSelected] && _highlightedTextColor)
422         textColor = _highlightedTextColor;
423     
424     if (!self.enabled)
425         textColor = [textColor colorWithAlphaComponent:0.5];
426     
427     return textColor;
428 }
429 
430 
431 - (UIColor *)textShadowColorAccordingToCurrentState
432 {
433     UIColor *textShadowColor = _textShadowColor;
434     
435     if ([self isHighlightedOrSelected] && _highlightedTextShadowColor)
436         textShadowColor = _highlightedTextShadowColor;
437     
438     return textShadowColor;
439 }
440 
441 
442 - (NSString *)textAccordingToCurrentState
443 {
444     NSString *text = _text;
445     
446     if (!self.enabled && _disabledText)
447         text = _disabledText;
448     else if ([self isHighlightedOrSelected] && _highlightedText)
449         text = _highlightedText;
450     
451     return text;
452 }
453 
454 
455 - (UIImage *)rightAccessoryImageAccordingToCurrentState
456 {
457     UIImage *image = _rightAccessoryImage;
458     
459     if ([self isHighlightedOrSelected] && _rightHighlightedAccessoryImage)
460         image = _rightHighlightedAccessoryImage;
461     
462     return image;
463 }
464 
465 
466 #pragma mark - Gradient
467 
468 - (CGGradientRef)newGradientAccordingToCurrentState
469 {
470     CGGradientRef gradient = NULL;
471     
472     // Compute the colors of the gradient
473     UIColor *middleColor = [self tintColorAccordingToCurrentState];
474     
475     CGFloat red = 0, green = 0, blue = 0, alpha = 0;
476     if ([middleColor respondsToSelector:@selector(getRed:green:blue:alpha:)]) // iOS 5+
477     {
478         [middleColor getRed:&red green:&green blue:&blue alpha:&alpha];
479     }
480     else if (middleColor)
481     {
482         CGColorRef color = [middleColor CGColor];
483         const CGFloat *components = CGColorGetComponents(color);
484         red = components[0];
485         green = components[1];
486         blue = components[2];
487         alpha = components[3];
488     }
489     
490     CGFloat offsetColor = 50.0f/255.0f;
491     UIColor *topColor = [UIColor colorWithRed:fminf(1, red+offsetColor) green:fminf(1, green+offsetColor) blue:fminf(1, blue+offsetColor) alpha:alpha];
492     UIColor *bottomColor = [UIColor colorWithRed:fminf(1, red-offsetColor) green:fminf(1, green-offsetColor) blue:fminf(1, blue-offsetColor) alpha:alpha];
493     
494     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
495     
496     // Create an array of colors
497     CFMutableArrayRef colors = CFArrayCreateMutable(NULL, 3, NULL);
498     CFArrayAppendValue(colors, [topColor CGColor]);
499     CFArrayAppendValue(colors, [middleColor CGColor]);
500     CFArrayAppendValue(colors, [bottomColor CGColor]);
501     
502     // Create the gradient
503     gradient = CGGradientCreateWithColors(colorSpace, colors, NULL);
504     
505     // Memory free
506     CFRelease(colors);
507     CGColorSpaceRelease(colorSpace);
508     
509     return gradient;
510 }
511 
512 
513 #pragma mark - Drawing
514 
515 #define DEFAULT_PADDING        4
516 
517 - (void)drawRect:(CGRect)rect
518 {
519     // Setting Env
520     CGContextRef ctx = UIGraphicsGetCurrentContext();
521     UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:_cornerRadius];
522     CGFloat padding = _borderWidth + DEFAULT_PADDING;
523     UIColor *borderColor = [self borderColorAccordingToCurrentState];
524     UIColor *textColor = [self textColorAccordingToCurrentState];
525     UIColor *textShadowColor = [self textShadowColorAccordingToCurrentState];
526     NSString *text = [self textAccordingToCurrentState];
527     
528     // Draw
529     [path addClip];
530     
531     // Draw background
532     if (_gradientEnabled)
533     {
534         CGGradientRef gradient = [self newGradientAccordingToCurrentState];
535         CGFloat midX = CGRectGetMidX(self.bounds);
536         CGFloat botY = CGRectGetMaxY(self.bounds);
537         CGPoint startPoint = CGPointMake(midX, 0);
538         CGPoint endPoint = CGPointMake(midX, botY);
539         CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, 0);
540         CGGradientRelease(gradient);
541     }
542     else
543     {
544         UIColor *tint = [self tintColorAccordingToCurrentState];
545         [tint set];
546         [path fill];
547     }
548     
549     // Draw right image
550     UIImage *rightImage = [self rightAccessoryImageAccordingToCurrentState];
551     CGRect rightAccessoryRect = CGRectZero;
552     if (rightImage)
553     {
554         CGFloat maxHeight = CGRectGetHeight(self.bounds) - padding*2;
555         rightAccessoryRect.size.height = MIN(maxHeight, rightImage.size.height);
556         rightAccessoryRect.size.width = rightAccessoryRect.size.height / rightImage.size.height * rightImage.size.width;
557         rightAccessoryRect.origin.y = (CGRectGetHeight(self.bounds) - CGRectGetHeight(rightAccessoryRect)) / 2;
558         rightAccessoryRect.origin.x = CGRectGetWidth(self.bounds) - CGRectGetWidth(rightAccessoryRect) - padding;
559         [rightImage drawInRect:rightAccessoryRect];
560     }
561     
562     // Draw border
563     if (_borderWidth > 0)
564     {
565         path.lineWidth = _borderWidth;
566         [borderColor set];
567         [path stroke];
568     }
569     
570     // Draw text
571     CGRect innerRect = self.bounds;
572     innerRect = CGRectInset(innerRect, padding, padding);
573     if (rightImage)
574         innerRect.size.width = CGRectGetMinX(rightAccessoryRect);
575     
576     _titleLabel.textColor = textColor;
577     _titleLabel.shadowColor = textShadowColor;
578     _titleLabel.text = text;
579     
580     [textColor set];
581     [_titleLabel drawTextInRect:innerRect];
582 }
583 
584 
585 #pragma mark - Touch Handling
586 
587 - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
588 {
589     self.highlighted = YES;
590     [self setNeedsDisplay];
591     return [super beginTrackingWithTouch:touch withEvent:event];
592 }
593 
594 
595 - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
596 {
597     self.highlighted = [self isTouchInside];
598     [self setNeedsDisplay];
599     return [super continueTrackingWithTouch:touch withEvent:event];
600 }
601 
602 
603 - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
604 {
605     [super endTrackingWithTouch:touch withEvent:event];
606     self.highlighted = NO;
607     [self setNeedsDisplay];
608 }
609 
610 
611 - (void)cancelTrackingWithEvent:(UIEvent *)event
612 {
613     [super cancelTrackingWithEvent:event];
614     self.highlighted = NO;
615     [self setNeedsDisplay];
616 }
617 
618 
619 #pragma mark - Accessibility
620 
621 - (BOOL)isAccessibilityElement
622 {
623     return YES;
624 }
625 
626 
627 - (NSString *)accessibilityLabel
628 {
629     return [self textAccordingToCurrentState];
630 }
631 
632 
633 - (UIAccessibilityTraits)accessibilityTraits
634 {
635     UIAccessibilityTraits traits = UIAccessibilityTraitButton;
636     
637     if ([self isHighlightedOrSelected])
638         traits = traits >> UIAccessibilityTraitSelected;
639     
640     if (!self.enabled)
641         traits = traits >> UIAccessibilityTraitNotEnabled;
642     
643     return traits;
644 }
645 
646 
647 - (NSString *)accessibilityHint
648 {
649     return [self textAccordingToCurrentState];
650 }
651 
652 
653 @end
View Code

使用范例:

NVUIGradientButton* btnRight = [[NVUIGradientButton alloc] initWithFrame:CGRectMake(self.view.frame.size.width-80, 5, 70, 30) style:NVUIGradientButtonStyleDefault];
    btnRight.text = @"返回首页";
    btnRight.textColor = [UIColor whiteColor];
    btnRight.highlightedTextColor = [UIColor whiteColor];
    btnRight.textShadowColor = [UIColor darkGrayColor];
    btnRight.tintColor = [UIColor colorWithRed:(CGFloat)98.0f/255.0f green:(CGFloat)122.0f/255.0f blue:(CGFloat)156.0/255.0f alpha:1];
    btnRight.highlightedTintColor = [UIColor colorWithRed:(CGFloat)81.0f/255.0f green:(CGFloat)102.0f/255.0f blue:(CGFloat)131.0f/255.0f alpha:1];
    btnRight.borderColor = [UIColor colorWithRed:(CGFloat)47.0f/255.0f green:(CGFloat)57.0f/255.0f blue:(CGFloat)67.0f/255.0f alpha:1];
    btnRight.highlightedBorderColor = [UIColor colorWithRed:(CGFloat)46.0f/255.0f green:(CGFloat)62.0f/255.0f blue:(CGFloat)87.0f/255.0f alpha:1];
    btnRight.titleLabel.font = [UIFont systemFontOfSize:12.0f];
    [btnRight addTarget:self action:@selector(onBtnRight:) forControlEvents:UIControlEventTouchUpInside];
原文地址:https://www.cnblogs.com/qc0815/p/3198289.html