aboutsummaryrefslogtreecommitdiff
path: root/iPhone/GTMFadeTruncatingLabel.m
diff options
context:
space:
mode:
authorGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2011-08-24 16:00:31 +0000
committerGravatar gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3>2011-08-24 16:00:31 +0000
commitd75eaf5688872bd6fe245e11c048c40817b7ee1b (patch)
treedce81e16a511779eb804dbc14e4971f8c61c2077 /iPhone/GTMFadeTruncatingLabel.m
parent5254e4910abd5fbb5d915ff033edd9212bf0d7fd (diff)
[Author: justincohen]
Fade to translucent mask used by chrome instead of an ellipses or just truncating the string. R=dmaclach APPROVED=dmaclach DELTA=249 (249 added, 0 deleted, 0 changed)
Diffstat (limited to 'iPhone/GTMFadeTruncatingLabel.m')
-rwxr-xr-xiPhone/GTMFadeTruncatingLabel.m115
1 files changed, 115 insertions, 0 deletions
diff --git a/iPhone/GTMFadeTruncatingLabel.m b/iPhone/GTMFadeTruncatingLabel.m
new file mode 100755
index 0000000..619e7bb
--- /dev/null
+++ b/iPhone/GTMFadeTruncatingLabel.m
@@ -0,0 +1,115 @@
+//
+// GTMFadeTruncatingLabel.m
+//
+// Copyright 2011 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy
+// of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+//
+#import "GTMFadeTruncatingLabel.h"
+
+@interface GTMFadeTruncatingLabel ()
+- (void)setup;
+- (UIImage*)getLinearGradient:(CGRect)rect;
+@end
+
+@implementation GTMFadeTruncatingLabel
+
+@synthesize truncateMode = truncateMode_;
+
+- (void)setup {
+ self.backgroundColor = [UIColor clearColor];
+ truncateMode_ = GTMFadeTruncatingTail;
+}
+
+- (id)initWithFrame:(CGRect)frame {
+ self = [super initWithFrame:frame];
+ if (self) {
+ [self setup];
+ }
+ return self;
+}
+
+- (void)awakeFromNib {
+ [self setup];
+}
+
+// Draw fade gradient mask if text is wider than rect.
+- (void)drawTextInRect:(CGRect)requestedRect {
+ CGContextRef context = UIGraphicsGetCurrentContext();
+ CGContextSaveGState(context);
+
+ CGSize size = [self.text sizeWithFont:self.font];
+ if (size.width > requestedRect.size.width) {
+ UIImage* image = [self getLinearGradient:requestedRect];
+ CGContextClipToMask(context, self.bounds, image.CGImage);
+ }
+
+ CGContextSetFillColorWithColor(context, self.textColor.CGColor);
+ [self.text drawInRect:requestedRect
+ withFont:self.font
+ lineBreakMode:UILineBreakModeClip
+ alignment:self.textAlignment];
+
+ CGContextRestoreGState(context);
+}
+
+// Create gradient opacity mask based on direction.
+- (UIImage*)getLinearGradient:(CGRect)rect {
+ // Create an opaque context.
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
+ CGContextRef context = CGBitmapContextCreate (NULL,
+ rect.size.width,
+ rect.size.height,
+ 8,
+ 4*rect.size.width,
+ colorSpace,
+ kCGImageAlphaNone);
+
+ // White background will mask opaque, black gradient will mask transparent.
+ CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
+ CGContextFillRect(context, rect);
+
+ // Create gradient from white to black.
+ CGFloat locs[2] = { 0.0f, 1.0f };
+ CGFloat components[4] = { 1.0f, 1.0f, 0.0f, 1.0f };
+ CGGradientRef gradient =
+ CGGradientCreateWithColorComponents(colorSpace, components, locs, 2);
+ CGColorSpaceRelease(colorSpace);
+
+ // Draw head and/or tail gradient.
+ CGFloat fadeWidth = MIN(rect.size.height * 2, floor(rect.size.width / 4));
+ CGFloat minX = CGRectGetMinX(rect);
+ CGFloat maxX = CGRectGetMaxX(rect);
+ if (self.truncateMode & GTMFadeTruncatingTail) {
+ CGFloat startX = maxX - fadeWidth;
+ CGPoint startPoint = CGPointMake(startX, CGRectGetMidY(rect));
+ CGPoint endPoint = CGPointMake(maxX, CGRectGetMidY(rect));
+ CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
+ }
+ if (self.truncateMode & GTMFadeTruncatingHead) {
+ CGFloat startX = minX + fadeWidth;
+ CGPoint startPoint = CGPointMake(startX, CGRectGetMidY(rect));
+ CGPoint endPoint = CGPointMake(minX, CGRectGetMidY(rect));
+ CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
+ }
+ CGGradientRelease(gradient);
+
+ // Clean up, return image.
+ CGImageRef ref = CGBitmapContextCreateImage(context);
+ UIImage* image = [UIImage imageWithCGImage:ref];
+ CGImageRelease(ref);
+ CGContextRelease(context);
+ return image;
+}
+
+@end