Files
ManagerDemo/Pods/DTCoreText/Core/Source/DTLinkButton.m
T
2014-08-08 13:27:54 +08:00

181 lines
3.7 KiB
Objective-C

//
// DTLinkButton.m
// DTCoreText
//
// Created by Oliver Drobnik on 1/16/11.
// Copyright 2011 Drobnik.com. All rights reserved.
//
#import "DTLinkButton.h"
#import "DTCoreText.h"
// constant for notification
NSString *DTLinkButtonDidHighlightNotification = @"DTLinkButtonDidHighlightNotification";
@interface DTLinkButton ()
- (void)highlightNotification:(NSNotification *)notification;
@end
@implementation DTLinkButton
{
NSURL *_URL;
NSString *_GUID;
CGSize _minimumHitSize;
BOOL _showsTouchWhenHighlighted;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.userInteractionEnabled = YES;
self.enabled = YES;
self.opaque = NO;
_showsTouchWhenHighlighted = YES;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(highlightNotification:) name:DTLinkButtonDidHighlightNotification object:nil];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark Drawing the Run
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
if (self.highlighted)
{
if (_showsTouchWhenHighlighted)
{
CGRect imageRect = [self contentRectForBounds:self.bounds];
UIBezierPath *roundedPath = [UIBezierPath bezierPathWithRoundedRect:imageRect cornerRadius:3.0f];
CGContextSetGrayFillColor(ctx, 0.73f, 0.4f);
[roundedPath fill];
}
}
}
#pragma mark Utilitiy
- (void)_adjustBoundsIfNecessary
{
CGRect bounds = self.bounds;
CGFloat widthExtend = 0;
CGFloat heightExtend = 0;
if (bounds.size.width < _minimumHitSize.width)
{
widthExtend = _minimumHitSize.width - bounds.size.width;
}
if (bounds.size.height < _minimumHitSize.height)
{
heightExtend = _minimumHitSize.height - bounds.size.height;
}
if (widthExtend>0 || heightExtend>0)
{
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(ceil(heightExtend/2.0f), ceil(widthExtend/2.0f), ceil(heightExtend/2.0f), ceil(widthExtend/2.0f));
// extend bounds by the calculated necessary edge insets
bounds.size.width += edgeInsets.left + edgeInsets.right;
bounds.size.height += edgeInsets.top + edgeInsets.bottom;
// apply bounds and insets
self.bounds = bounds;
self.contentEdgeInsets = edgeInsets;
}
else
{
self.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
}
}
#pragma mark Notifications
- (void)highlightNotification:(NSNotification *)notification
{
if ([notification object] == self)
{
// that was me
return;
}
NSDictionary *userInfo = [notification userInfo];
NSString *guid = [userInfo objectForKey:@"GUID"];
if ([guid isEqualToString:_GUID])
{
BOOL highlighted = [[userInfo objectForKey:@"Highlighted"] boolValue];
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
}
#pragma mark Properties
- (void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
[self setNeedsDisplay];
// notify other parts of the same link
if (_GUID)
{
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:highlighted], @"Highlighted", _GUID, @"GUID", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:DTLinkButtonDidHighlightNotification object:self userInfo:userInfo];
}
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
if (CGRectIsEmpty(frame))
{
return;
}
[self _adjustBoundsIfNecessary];
}
- (void)setMinimumHitSize:(CGSize)minimumHitSize
{
if (CGSizeEqualToSize(_minimumHitSize, minimumHitSize))
{
return;
}
_minimumHitSize = minimumHitSize;
[self _adjustBoundsIfNecessary];
}
@synthesize URL = _URL;
@synthesize GUID = _GUID;
@synthesize minimumHitSize = _minimumHitSize;
@synthesize showsTouchWhenHighlighted = _showsTouchWhenHighlighted;
@end