Ramon Vasconcelos
Ramon Vasconcelos

Reputation: 1466

UITextField rounded corner text

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? Reference picture for my UITextField

Upvotes: 3

Views: 757

Answers (3)

Milap Kundalia
Milap Kundalia

Reputation: 1606

Try zftokenfield you can change the UI of this component as per your requirements

Upvotes: 0

Ramon Vasconcelos
Ramon Vasconcelos

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

iDeveloper
iDeveloper

Reputation: 2444

For Swift Developers

It may be helpful sometime.

Rounded Corner

Upvotes: 0

Related Questions