mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
6.3 KiB
Objective-C
160 lines
6.3 KiB
Objective-C
//
|
|
// Created by Jesse Squires
|
|
// http://www.jessesquires.com
|
|
//
|
|
//
|
|
// Documentation
|
|
// http://cocoadocs.org/docsets/JSQMessagesViewController
|
|
//
|
|
//
|
|
// GitHub
|
|
// https://github.com/jessesquires/JSQMessagesViewController
|
|
//
|
|
//
|
|
// License
|
|
// Copyright (c) 2014 Jesse Squires
|
|
// Released under an MIT license: http://opensource.org/licenses/MIT
|
|
//
|
|
|
|
#import "JSQMessagesAvatarImageFactory.h"
|
|
|
|
#import "UIColor+JSQMessages.h"
|
|
|
|
|
|
@implementation JSQMessagesAvatarImageFactory
|
|
|
|
#pragma mark - Public
|
|
|
|
+ (JSQMessagesAvatarImage *)avatarImageWithPlaceholder:(UIImage *)placeholderImage diameter:(NSUInteger)diameter
|
|
{
|
|
UIImage *circlePlaceholderImage = [JSQMessagesAvatarImageFactory jsq_circularImage:placeholderImage
|
|
withDiameter:diameter
|
|
highlightedColor:nil];
|
|
|
|
return [JSQMessagesAvatarImage avatarImageWithPlaceholder:circlePlaceholderImage];
|
|
}
|
|
|
|
+ (JSQMessagesAvatarImage *)avatarImageWithImage:(UIImage *)image diameter:(NSUInteger)diameter
|
|
{
|
|
UIImage *avatar = [JSQMessagesAvatarImageFactory circularAvatarImage:image withDiameter:diameter];
|
|
UIImage *highlightedAvatar = [JSQMessagesAvatarImageFactory circularAvatarHighlightedImage:image withDiameter:diameter];
|
|
|
|
return [[JSQMessagesAvatarImage alloc] initWithAvatarImage:avatar
|
|
highlightedImage:highlightedAvatar
|
|
placeholderImage:avatar];
|
|
}
|
|
|
|
+ (UIImage *)circularAvatarImage:(UIImage *)image withDiameter:(NSUInteger)diameter
|
|
{
|
|
return [JSQMessagesAvatarImageFactory jsq_circularImage:image
|
|
withDiameter:diameter
|
|
highlightedColor:nil];
|
|
}
|
|
|
|
+ (UIImage *)circularAvatarHighlightedImage:(UIImage *)image withDiameter:(NSUInteger)diameter
|
|
{
|
|
return [JSQMessagesAvatarImageFactory jsq_circularImage:image
|
|
withDiameter:diameter
|
|
highlightedColor:[UIColor colorWithWhite:0.1f alpha:0.3f]];
|
|
}
|
|
|
|
+ (JSQMessagesAvatarImage *)avatarImageWithUserInitials:(NSString *)userInitials
|
|
backgroundColor:(UIColor *)backgroundColor
|
|
textColor:(UIColor *)textColor
|
|
font:(UIFont *)font
|
|
diameter:(NSUInteger)diameter
|
|
{
|
|
UIImage *avatarImage = [JSQMessagesAvatarImageFactory jsq_imageWitInitials:userInitials
|
|
backgroundColor:backgroundColor
|
|
textColor:textColor
|
|
font:font
|
|
diameter:diameter];
|
|
|
|
UIImage *avatarHighlightedImage = [JSQMessagesAvatarImageFactory jsq_circularImage:avatarImage
|
|
withDiameter:diameter
|
|
highlightedColor:[UIColor colorWithWhite:0.1f alpha:0.3f]];
|
|
|
|
return [[JSQMessagesAvatarImage alloc] initWithAvatarImage:avatarImage
|
|
highlightedImage:avatarHighlightedImage
|
|
placeholderImage:avatarImage];
|
|
}
|
|
|
|
#pragma mark - Private
|
|
|
|
+ (UIImage *)jsq_imageWitInitials:(NSString *)initials
|
|
backgroundColor:(UIColor *)backgroundColor
|
|
textColor:(UIColor *)textColor
|
|
font:(UIFont *)font
|
|
diameter:(NSUInteger)diameter
|
|
{
|
|
NSParameterAssert(initials != nil);
|
|
NSParameterAssert(backgroundColor != nil);
|
|
NSParameterAssert(textColor != nil);
|
|
NSParameterAssert(font != nil);
|
|
NSParameterAssert(diameter > 0);
|
|
|
|
CGRect frame = CGRectMake(0.0f, 0.0f, diameter, diameter);
|
|
|
|
NSDictionary *attributes = @{ NSFontAttributeName : font,
|
|
NSForegroundColorAttributeName : textColor };
|
|
|
|
CGRect textFrame = [initials boundingRectWithSize:frame.size
|
|
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
|
|
attributes:attributes
|
|
context:nil];
|
|
|
|
CGPoint frameMidPoint = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame));
|
|
CGPoint textFrameMidPoint = CGPointMake(CGRectGetMidX(textFrame), CGRectGetMidY(textFrame));
|
|
|
|
CGFloat dx = frameMidPoint.x - textFrameMidPoint.x;
|
|
CGFloat dy = frameMidPoint.y - textFrameMidPoint.y;
|
|
CGPoint drawPoint = CGPointMake(dx, dy);
|
|
UIImage *image = nil;
|
|
|
|
UIGraphicsBeginImageContextWithOptions(frame.size, NO, [UIScreen mainScreen].scale);
|
|
{
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGContextSetFillColorWithColor(context, backgroundColor.CGColor);
|
|
CGContextFillRect(context, frame);
|
|
[initials drawAtPoint:drawPoint withAttributes:attributes];
|
|
|
|
image = UIGraphicsGetImageFromCurrentImageContext();
|
|
|
|
}
|
|
UIGraphicsEndImageContext();
|
|
|
|
return [JSQMessagesAvatarImageFactory jsq_circularImage:image withDiameter:diameter highlightedColor:nil];
|
|
}
|
|
|
|
+ (UIImage *)jsq_circularImage:(UIImage *)image withDiameter:(NSUInteger)diameter highlightedColor:(UIColor *)highlightedColor
|
|
{
|
|
NSParameterAssert(image != nil);
|
|
NSParameterAssert(diameter > 0);
|
|
|
|
CGRect frame = CGRectMake(0.0f, 0.0f, diameter, diameter);
|
|
UIImage *newImage = nil;
|
|
|
|
UIGraphicsBeginImageContextWithOptions(frame.size, NO, [UIScreen mainScreen].scale);
|
|
{
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
UIBezierPath *imgPath = [UIBezierPath bezierPathWithOvalInRect:frame];
|
|
[imgPath addClip];
|
|
[image drawInRect:frame];
|
|
|
|
if (highlightedColor != nil) {
|
|
CGContextSetFillColorWithColor(context, highlightedColor.CGColor);
|
|
CGContextFillEllipseInRect(context, frame);
|
|
}
|
|
|
|
newImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
|
|
}
|
|
UIGraphicsEndImageContext();
|
|
|
|
return newImage;
|
|
}
|
|
|
|
@end
|