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?
Asked
Active
Viewed 740 times
3

Sandy Patel
- 768
- 7
- 19

Ramon Vasconcelos
- 1,466
- 1
- 21
- 28
-
1What you have tried? – rohit Sidpara Oct 10 '16 at 12:28
-
I was trying this http://stackoverflow.com/questions/21857408/how-to-set-nsstrings-background-cornerradius-on-ios7 but it's for a textview not a textfield this way I couldn't implement the desired behaviour. – Ramon Vasconcelos Oct 10 '16 at 12:35
3 Answers
1
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;
}

Community
- 1
- 1

Ramon Vasconcelos
- 1,466
- 1
- 21
- 28
0
Try zftokenfield you can change the UI of this component as per your requirements

koen
- 5,383
- 7
- 50
- 89

Milap Kundalia
- 1,566
- 1
- 16
- 24