Create a gist now

Instantly share code, notes, and snippets.

@kwigbo /WorkingTextField Secret
Last active Dec 18, 2015

What would you like to do?
Fix for UITextField attributedPlaceholder
// -- .h
extern const NSString *PLACEHOLDER_BASELINE_ATTRIBUTE;
extern const NSString *PLACEHOLDER_LEFT_ATTRIBUTE;
/**
* In this UITextField subclass, the attributedPlaceholder text actually works.
*
* @author Jed Laudenslayer
*/
@interface WorkingTextField : UITextField
//! The color for the attributed text.
@property (nonatomic, strong) UIColor *placeholderTextColor;
@end
// -- .m
#import "WorkingTextField.h"
const NSString *PLACEHOLDER_BASELINE_ATTRIBUTE = @"baseline_attribute";
const NSString *PLACEHOLDER_LEFT_ATTRIBUTE = @"left_attribute";
@implementation WorkingTextField
{
NSAttributedString *realAttributedPlaceholder_;
}
@synthesize placeholderTextColor = placeholderTextColor_;
- (void)setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholder
{
[super setAttributedPlaceholder:attributedPlaceholder];
realAttributedPlaceholder_ = attributedPlaceholder;
}
- (void)drawPlaceholderInRect:(CGRect)rect
{
if (realAttributedPlaceholder_ != nil)
{
__block NSAttributedString *placeholder = realAttributedPlaceholder_;
__block CGFloat lastX = 0.0;
[placeholder enumerateAttributesInRange:NSMakeRange(0, placeholder.length)
options:0
usingBlock:[^(NSDictionary *attrs, NSRange range, BOOL *stop) {
CGFloat baseline = [attrs[PLACEHOLDER_BASELINE_ATTRIBUTE] floatValue];
CGFloat leftOffset = [attrs[PLACEHOLDER_LEFT_ATTRIBUTE] floatValue];
NSMutableAttributedString *subString = [[NSMutableAttributedString alloc]
initWithAttributedString:[placeholder
attributedSubstringFromRange:range]];
if (placeholderTextColor_ != nil && [attrs objectForKey:NSForegroundColorAttributeName] == nil)
{
[subString addAttribute:NSForegroundColorAttributeName value:placeholderTextColor_ range:NSMakeRange(0, subString.length)];
}
CGSize stringSize = subString.size;
[subString drawAtPoint:CGPointMake(lastX + leftOffset, (rect.origin.y + rect.size.height) - (stringSize.height + baseline))];
lastX += stringSize.width;
} copy]];
}
else
{
[super drawPlaceholderInRect:rect];
}
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment