135 lines
6.1 KiB
Objective-C
Executable File
135 lines
6.1 KiB
Objective-C
Executable File
//
|
|
// NYPopover.m
|
|
// NYReader
|
|
//
|
|
// Created by Cassius Pacheco on 21/12/12.
|
|
// Copyright (c) 2012 Nyvra Software. All rights reserved.
|
|
//
|
|
|
|
#import "NYPopover.h"
|
|
|
|
@implementation NYPopover
|
|
|
|
- (id)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
|
|
self.textLabel = [[UILabel alloc] initWithFrame:CGRectZero];
|
|
self.textLabel.backgroundColor = [UIColor clearColor];
|
|
self.textLabel.textColor = [UIColor whiteColor];
|
|
self.textLabel.font = [UIFont boldSystemFontOfSize:13];
|
|
self.textLabel.textAlignment = NSTextAlignmentCenter;
|
|
self.textLabel.adjustsFontSizeToFitWidth = YES;
|
|
self.opaque = NO;
|
|
|
|
[self addSubview:self.textLabel];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)setFrame:(CGRect)frame
|
|
{
|
|
[super setFrame:frame];
|
|
|
|
CGFloat y = (frame.size.height - 26) / 3;
|
|
|
|
if (frame.size.height < 38)
|
|
y = 0;
|
|
|
|
self.textLabel.frame = CGRectMake(0, y, frame.size.width, 26);
|
|
}
|
|
|
|
- (void)drawRect:(CGRect)rect
|
|
{
|
|
//// General Declarations
|
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
//// Color Declarations
|
|
UIColor* gradientColor = [UIColor colorWithRed: 0.267 green: 0.303 blue: 0.335 alpha: 1];
|
|
UIColor* gradientColor2 = [UIColor colorWithRed: 0.04 green: 0.04 blue: 0.04 alpha: 1];
|
|
UIColor* shadowColor2 = [UIColor colorWithRed: 0.524 green: 0.553 blue: 0.581 alpha: 0.3];
|
|
|
|
//// Gradient Declarations
|
|
NSArray* gradientColors = [NSArray arrayWithObjects:
|
|
(id)gradientColor.CGColor,
|
|
(id)gradientColor2.CGColor, nil];
|
|
CGFloat gradientLocations[] = {0, 1};
|
|
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)gradientColors, gradientLocations);
|
|
|
|
//// Shadow Declarations
|
|
UIColor* innerShadow = shadowColor2;
|
|
CGSize innerShadowOffset = CGSizeMake(0, 1.5);
|
|
CGFloat innerShadowBlurRadius = 0.5;
|
|
|
|
//// Frames
|
|
CGRect frame = self.bounds;
|
|
|
|
//// Subframes
|
|
CGRect frame2 = CGRectMake(CGRectGetMinX(frame) + floor((CGRectGetWidth(frame) - 11) * 0.51724 + 0.5), CGRectGetMinY(frame) + CGRectGetHeight(frame) - 9, 11, 9);
|
|
|
|
|
|
//// Bezier Drawing
|
|
UIBezierPath* bezierPath = [UIBezierPath bezierPath];
|
|
[bezierPath moveToPoint: CGPointMake(CGRectGetMaxX(frame) - 0.5, CGRectGetMinY(frame) + 4.5)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMaxX(frame) - 0.5, CGRectGetMaxY(frame) - 11.5)];
|
|
[bezierPath addCurveToPoint: CGPointMake(CGRectGetMaxX(frame) - 4.5, CGRectGetMaxY(frame) - 7.5) controlPoint1: CGPointMake(CGRectGetMaxX(frame) - 0.5, CGRectGetMaxY(frame) - 9.29) controlPoint2: CGPointMake(CGRectGetMaxX(frame) - 2.29, CGRectGetMaxY(frame) - 7.5)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame2) + 10.64, CGRectGetMinY(frame2) + 1.5)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame2) + 5.5, CGRectGetMinY(frame2) + 8)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame2) + 0.36, CGRectGetMinY(frame2) + 1.5)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 4.5, CGRectGetMaxY(frame) - 7.5)];
|
|
[bezierPath addCurveToPoint: CGPointMake(CGRectGetMinX(frame) + 0.5, CGRectGetMaxY(frame) - 11.5) controlPoint1: CGPointMake(CGRectGetMinX(frame) + 2.29, CGRectGetMaxY(frame) - 7.5) controlPoint2: CGPointMake(CGRectGetMinX(frame) + 0.5, CGRectGetMaxY(frame) - 9.29)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMinX(frame) + 0.5, CGRectGetMinY(frame) + 4.5)];
|
|
[bezierPath addCurveToPoint: CGPointMake(CGRectGetMinX(frame) + 4.5, CGRectGetMinY(frame) + 0.5) controlPoint1: CGPointMake(CGRectGetMinX(frame) + 0.5, CGRectGetMinY(frame) + 2.29) controlPoint2: CGPointMake(CGRectGetMinX(frame) + 2.29, CGRectGetMinY(frame) + 0.5)];
|
|
[bezierPath addLineToPoint: CGPointMake(CGRectGetMaxX(frame) - 4.5, CGRectGetMinY(frame) + 0.5)];
|
|
[bezierPath addCurveToPoint: CGPointMake(CGRectGetMaxX(frame) - 0.5, CGRectGetMinY(frame) + 4.5) controlPoint1: CGPointMake(CGRectGetMaxX(frame) - 2.29, CGRectGetMinY(frame) + 0.5) controlPoint2: CGPointMake(CGRectGetMaxX(frame) - 0.5, CGRectGetMinY(frame) + 2.29)];
|
|
[bezierPath closePath];
|
|
CGContextSaveGState(context);
|
|
[bezierPath addClip];
|
|
CGRect bezierBounds = bezierPath.bounds;
|
|
CGContextDrawLinearGradient(context, gradient,
|
|
CGPointMake(CGRectGetMidX(bezierBounds), CGRectGetMinY(bezierBounds)),
|
|
CGPointMake(CGRectGetMidX(bezierBounds), CGRectGetMaxY(bezierBounds)),
|
|
0);
|
|
CGContextRestoreGState(context);
|
|
|
|
////// Bezier Inner Shadow
|
|
CGRect bezierBorderRect = CGRectInset([bezierPath bounds], -innerShadowBlurRadius, -innerShadowBlurRadius);
|
|
bezierBorderRect = CGRectOffset(bezierBorderRect, -innerShadowOffset.width, -innerShadowOffset.height);
|
|
bezierBorderRect = CGRectInset(CGRectUnion(bezierBorderRect, [bezierPath bounds]), -1, -1);
|
|
|
|
UIBezierPath* bezierNegativePath = [UIBezierPath bezierPathWithRect: bezierBorderRect];
|
|
[bezierNegativePath appendPath: bezierPath];
|
|
bezierNegativePath.usesEvenOddFillRule = YES;
|
|
|
|
CGContextSaveGState(context);
|
|
{
|
|
CGFloat xOffset = innerShadowOffset.width + round(bezierBorderRect.size.width);
|
|
CGFloat yOffset = innerShadowOffset.height;
|
|
CGContextSetShadowWithColor(context,
|
|
CGSizeMake(xOffset + copysign(0.1, xOffset), yOffset + copysign(0.1, yOffset)),
|
|
innerShadowBlurRadius,
|
|
innerShadow.CGColor);
|
|
|
|
[bezierPath addClip];
|
|
CGAffineTransform transform = CGAffineTransformMakeTranslation(-round(bezierBorderRect.size.width), 0);
|
|
[bezierNegativePath applyTransform: transform];
|
|
[[UIColor grayColor] setFill];
|
|
[bezierNegativePath fill];
|
|
}
|
|
CGContextRestoreGState(context);
|
|
|
|
[[UIColor blackColor] setStroke];
|
|
bezierPath.lineWidth = 1;
|
|
[bezierPath stroke];
|
|
|
|
|
|
//// Cleanup
|
|
CGGradientRelease(gradient);
|
|
CGColorSpaceRelease(colorSpace);
|
|
}
|
|
|
|
@end
|