Reputation: 1466
Is there any way to add an array of strings with rounded corners and grey background color. but the last string is without these attributes on my UITextField using attributed text only?
Upvotes: 3
Views: 757
Reputation: 1606
Try zftokenfield you can change the UI of this component as per your requirements
Upvotes: 0
Reputation: 1466
I had to change my UITextField to UITextView and then used the solution from How to set NSString's background cornerRadius on iOS7 and I did some tweaks using the UITextView delegate.
@implementation MyLayoutManager
- (void)fillBackgroundRectArray:(const CGRect *)rectArray count:(NSUInteger)rectCount forCharacterRange:(NSRange)charRange color:(UIColor *)color
{
CGFloat halfLineWidth = 4.; // change this to change corners radius
CGMutablePathRef path = CGPathCreateMutable();
if (rectCount == 1
|| (rectCount == 2 && (CGRectGetMaxX(rectArray[1]) < CGRectGetMinX(rectArray[0])))
)
{
// 1 rect or 2 rects without edges in contact
CGPathAddRect(path, NULL, CGRectInset(rectArray[0], halfLineWidth, halfLineWidth));
if (rectCount == 2)
CGPathAddRect(path, NULL, CGRectInset(rectArray[1], halfLineWidth, halfLineWidth));
}
else
{
// 2 or 3 rects
NSUInteger lastRect = rectCount - 1;
CGPathMoveToPoint(path, NULL, CGRectGetMinX(rectArray[0]) + halfLineWidth, CGRectGetMaxY(rectArray[0]) + halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rectArray[0]) + halfLineWidth, CGRectGetMinY(rectArray[0]) + halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rectArray[0]) - halfLineWidth, CGRectGetMinY(rectArray[0]) + halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rectArray[0]) - halfLineWidth, CGRectGetMinY(rectArray[lastRect]) - halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rectArray[lastRect]) - halfLineWidth, CGRectGetMinY(rectArray[lastRect]) - halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rectArray[lastRect]) - halfLineWidth, CGRectGetMaxY(rectArray[lastRect]) - halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rectArray[lastRect]) + halfLineWidth, CGRectGetMaxY(rectArray[lastRect]) - halfLineWidth);
CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rectArray[lastRect]) + halfLineWidth, CGRectGetMaxY(rectArray[0]) + halfLineWidth);
CGPathCloseSubpath(path);
}
[color set]; // set fill and stroke color
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, halfLineWidth * 2.);
CGContextSetLineJoin(ctx, kCGLineJoinRound);
CGContextAddPath(ctx, path);
CGPathRelease(path);
CGContextDrawPath(ctx, kCGPathFillStroke);
}
@end
- (void)updateHeaderWithText:(NSString*) text {
// setup text handling
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:text];
// use our subclass of NSLayoutManager
MyLayoutManager *textLayout = [[MyLayoutManager alloc] init];
[textStorage addLayoutManager:textLayout];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.view.bounds.size];
[textLayout addTextContainer:textContainer];
UITextView *textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, self.navigationController.navigationBar.frame.size.width, 30.0) textContainer:textContainer];
self.navigationItem.titleView = textView;
// set some background color to our text
NSInteger rangeInitPlace = 0;
for (NSString *word in self.namesArray) {
if (![word isEqualToString:@" , "]) {
[textView.textStorage setAttributes:[NSDictionary dictionaryWithObject:[UIColor lightGrayColor] forKey:NSBackgroundColorAttributeName] range:NSMakeRange(rangeInitPlace, word.length)];
}
rangeInitPlace += word.length;
}
textView.delegate = self;
[textView becomeFirstResponder];
textView.selectedRange = NSMakeRange([textView.text length], 0);
}
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSRange selectedRange = textView.selectedRange;
UITextPosition *beginning = textView.beginningOfDocument;
UITextPosition *start = [textView positionFromPosition:beginning offset:selectedRange.location];
UITextPosition *end = [textView positionFromPosition:start offset:selectedRange.length];
UITextRange* textRange = [textView.tokenizer rangeEnclosingPosition:end withGranularity:UITextGranularityWord inDirection:UITextLayoutDirectionLeft];
NSLog(@"Word that is currently being edited is : %@", [textView textInRange:textRange]);
NSDictionary *normalAttrdict = [NSDictionary dictionaryWithObject:[UIColor brownColor] forKey:NSForegroundColorAttributeName];
textView.typingAttributes = normalAttrdict;
return YES;
}
Upvotes: 1