Finished implementation for header/footer for iOS

This commit is contained in:
Sebastián Katzer 2019-01-22 15:27:31 +01:00
parent ee88021da0
commit 69541fb13e
2 changed files with 166 additions and 27 deletions

View File

@ -23,6 +23,12 @@
#include "APPPrinterRenderer.h" #include "APPPrinterRenderer.h"
#include "APPPrinterUnit.h" #include "APPPrinterUnit.h"
@interface APPPrinterRenderer ()
@property (nonatomic, retain) NSDictionary *settings;
@end
@implementation APPPrinterRenderer @implementation APPPrinterRenderer
#pragma mark - #pragma mark -
@ -48,51 +54,178 @@
if (header) if (header)
{ {
dots = [APPPrinterUnit convert:header[@"unit"]]; dots = [APPPrinterUnit convert:header[@"unit"]];
self.headerHeight = dots * [header[@"height"] doubleValue]; self.headerHeight = dots * [header[@"height"] floatValue];
} }
if (footer) if (footer)
{ {
dots = [APPPrinterUnit convert:header[@"unit"]]; dots = [APPPrinterUnit convert:footer[@"unit"]];
self.footerHeight = dots * [footer[@"height"] doubleValue]; self.footerHeight = dots * [footer[@"height"] floatValue];
} }
_settings = spec;
return self; return self;
} }
#pragma mark - #pragma mark -
#pragma mark Private #pragma mark Callbacks
- (void) drawHeaderForPageAtIndex:(NSInteger)index inRect:(CGRect)rect - (void) drawHeaderForPageAtIndex:(NSInteger)index inRect:(CGRect)rect
{ {
NSString *header = [NSString stringWithFormat:@"Sample header at page %ld", index + 1]; [self drawLabelsFromDictionary:_settings[@"header"]
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; forPageAtIndex:index
inRect:rect];
style.alignment = NSTextAlignmentRight;
UIFont *font = [UIFont fontWithName:@"Courier" size:UIFont.labelFontSize];
NSDictionary *attrs = @{ NSFontAttributeName: font,
NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName: [UIColor redColor]};
[header drawInRect:rect withAttributes:attrs];
} }
- (void) drawFooterForPageAtIndex:(NSInteger)index inRect:(CGRect)rect - (void) drawFooterForPageAtIndex:(NSInteger)index inRect:(CGRect)rect
{ {
NSString *footer = @"Sample Footer"; [self drawLabelsFromDictionary:_settings[@"footer"]
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; forPageAtIndex:index
inRect:rect];
}
style.alignment = NSTextAlignmentCenter; #pragma mark -
#pragma mark Private
UIFont *font = [UIFont fontWithName:@"Helvetica" size:UIFont.buttonFontSize]; - (void) drawLabelsFromDictionary:(NSDictionary *)spec
forPageAtIndex:(NSInteger)index
inRect:(CGRect)rect
{
NSDictionary* label = spec[@"label"];
NSArray *labels = label ? @[label] : spec[@"labels"];
if (!labels)
{
NSString *text = spec[@"text"];
if (![self strIsNullOrEmpty:text])
{
labels = @[@{ @"text":text }];
}
}
if (!labels) return;
for (label in labels) {
[self drawLabelFromDictionary:label forPageAtIndex:index inRect:rect];
}
}
- (void) drawLabelFromDictionary:(NSDictionary *)spec
forPageAtIndex:(NSInteger)index
inRect:(CGRect)rect
{
NSString *label = spec[@"text"];
NSString *align = spec[@"align"];
BOOL showIndex = [spec[@"showPageIndex"] boolValue];
if (showIndex)
{
label = [self strIsNullOrEmpty:label] ? @"%ld" : label;
label = [NSString stringWithFormat:label, index + 1];
}
if ([self strIsNullOrEmpty:label])
return;
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle]
mutableCopy];
if ([align isEqualToString:@"left"])
{
style.alignment = NSTextAlignmentLeft;
}
else if ([align isEqualToString:@"right"])
{
style.alignment = NSTextAlignmentRight;
}
else if ([align isEqualToString:@"center"])
{
style.alignment = NSTextAlignmentCenter;
}
else if ([align isEqualToString:@"justified"])
{
style.alignment = NSTextAlignmentJustified;
}
NSString *hex = spec[@"color"];
UIColor *color;
if ([self strIsNullOrEmpty:hex])
{
color = UIColor.darkTextColor;
}
else
{
if ([hex characterAtIndex:0] == '#')
{
hex = [hex substringFromIndex:1];
}
color = [self colorFromHexString:hex];
}
if (!color)
{
color = UIColor.darkTextColor;
}
double size = [spec[@"size"] doubleValue];
if (size <= 0.0)
{
size = UIFont.smallSystemFontSize;
}
UIFont *font = [UIFont fontWithName:spec[@"font"] size:size];
if (!font)
{
font = [UIFont systemFontOfSize:size];
}
UIFontDescriptorSymbolicTraits traits = 0;
if ([spec[@"bold"] boolValue])
{
traits = traits | UIFontDescriptorTraitBold;
}
if ([spec[@"italic"] boolValue])
{
traits = traits | UIFontDescriptorTraitItalic;
}
font = [UIFont fontWithDescriptor:[font.fontDescriptor fontDescriptorWithSymbolicTraits:traits]
size:size];
NSDictionary *attrs = @{ NSFontAttributeName: font, NSDictionary *attrs = @{ NSFontAttributeName: font,
NSParagraphStyleAttributeName: style, NSParagraphStyleAttributeName: style,
NSForegroundColorAttributeName: [UIColor blueColor]}; NSForegroundColorAttributeName: color };
[footer drawInRect:rect withAttributes:attrs]; [label drawInRect:rect withAttributes:attrs];
}
- (BOOL) strIsNullOrEmpty:(NSString *)string
{
return [string isEqual:[NSNull null]] || string.length == 0;
}
- (UIColor *)colorFromHexString:(NSString *)hex
{
unsigned rgb = 0;
NSScanner *scanner = [NSScanner scannerWithString:hex];
[scanner setCharactersToBeSkipped:
[NSCharacterSet characterSetWithCharactersInString:@"#"]];
[scanner scanHexInt:&rgb];
return [UIColor colorWithRed:((rgb & 0xFF0000) >> 16)/255.0
green:((rgb & 0xFF00) >> 8)/255.0
blue:(rgb & 0xFF)/255.0 alpha:1.0];
} }
@end @end

View File

@ -57,12 +57,18 @@ exports.getDefaults = function () {
header: { header: {
unit: 'cm', unit: 'cm',
height: 0, height: 1,
},
footer: { labels: [{
unit: 'cm', text: 'Awesome Printer Plug-in',
height: 0 align: 'center',
italic: true,
color: '#FF0000'
},{
showPageIndex: true,
align: 'right',
bold: true
}]
} }
}; };
}; };