objective-c background cornerradius

objective c - Cómo establecer el fondo cornerRadius de NSString en iOS7



objective-c background (6)

Como complemento de la solución de @ Emmanuel, agregando

CGContextSetAllowsAntialiasing(ctx, YES); CGContextSetShouldAntialias(ctx, YES);

hará que se vea mucho mejor.

Quiero configurar el fondo de NSString cornerRadius en iOS7. Pero, NSString no tiene capa ...

Por favor, dígame, ¿cómo configurar el fondo cornerRadius de NSString en iOS7?

ejemplo


NSString no tiene eso. NSAttributedString tiene una propiedad backgroundColor que se puede usar pero sin representación personalizada, no podrá establecer un radio de esquina para la selección de fragmentos de texto.

Por lo tanto, debe escribir una UIView personalizada para procesar su texto


Un NSString solo define una cadena de texto. No define las propiedades de cómo se representa. Para mostrar texto en la pantalla, usualmente se UILabel una UILabel o UITextView . Sin embargo, para el comportamiento de selección que está mostrando en su ejemplo, tendrá que hacer ese dibujo usted mismo. También está cambiando el color del texto seleccionado, por lo que deberá manejarlo usted mismo.

Si creó una UIView personalizada que le permite dibujar el área de selección azul, podría colocarla detrás de una UILabel , y podría usar una NSAttributedString para establecer el texto de la etiqueta donde el texto "seleccionado" es blanco en lugar de negro. Esa sería probablemente la forma más simple de hacer esto.


Puede hacerlo utilizando una UITextView con una subclase de NSLayoutManager , que sobrescribe -fillBackgroundRectArray:count:forCharacterRange:color: Solo una pequeña muestra de cómo hacerlo:

@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // setup text handling NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."]; // 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,20,self.view.bounds.size.width,self.view.bounds.size.height-20) textContainer:textContainer]; [self.view addSubview:textView]; // set some background color to our text [textView.textStorage setAttributes:[NSDictionary dictionaryWithObject:[UIColor blueColor] forKey:NSBackgroundColorAttributeName] range:NSMakeRange(22, textView.text.length - 61)]; } @end @interface MyLayoutManager : NSLayoutManager @end - (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


El código de Emmanuel en rápido:

class TagLayoutManager : NSLayoutManager { override func fillBackgroundRectArray(rectArray: UnsafePointer<CGRect>, count rectCount: Int, forCharacterRange charRange: NSRange, color: UIColor) { let cornerRadius:CGFloat = 3.0 let path = CGPathCreateMutable() if rectCount == 1 || (rectCount == 2 && (CGRectGetMaxX(rectArray[1]) < CGRectGetMaxX(rectArray[0]))) { CGPathAddRect(path, nil, CGRectInset(rectArray[0], cornerRadius, cornerRadius)) if rectCount == 2 { CGPathAddRect(path, nil, CGRectInset(rectArray[1], cornerRadius, cornerRadius)) } } else { let lastRect = rectCount - 1 CGPathMoveToPoint(path, nil, CGRectGetMinX(rectArray[0]) + cornerRadius, CGRectGetMaxY(rectArray[0]) + cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMinX(rectArray[0]) + cornerRadius, CGRectGetMinY(rectArray[0]) + cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMaxX(rectArray[0]) - cornerRadius, CGRectGetMinY(rectArray[0]) + cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMaxX(rectArray[0]) - cornerRadius, CGRectGetMinY(rectArray[lastRect]) - cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMaxX(rectArray[lastRect]) - cornerRadius, CGRectGetMinY(rectArray[lastRect]) - cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMaxX(rectArray[lastRect]) - cornerRadius, CGRectGetMaxY(rectArray[lastRect]) - cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMinX(rectArray[lastRect]) + cornerRadius, CGRectGetMaxY(rectArray[lastRect]) - cornerRadius); CGPathAddLineToPoint(path, nil, CGRectGetMinX(rectArray[lastRect]) + cornerRadius, CGRectGetMaxY(rectArray[0]) + cornerRadius); CGPathCloseSubpath(path); } color.set() let ctx = UIGraphicsGetCurrentContext() CGContextSetLineWidth(ctx, cornerRadius * 2.0) CGContextSetLineJoin(ctx, .Round) CGContextAddPath(ctx, path) CGContextDrawPath(ctx, .FillStroke) }

}


Actualice a Swift 3.1 el código de Emmanuel en swift updated a la versión 3.1

class TagLayoutManager: NSLayoutManager { override func fillBackgroundRectArray(_ rectArray: UnsafePointer<CGRect>, count rectCount: Int, forCharacterRange charRange: NSRange, color: UIColor) { let cornerRadius:CGFloat = 5 let path = CGMutablePath.init() if rectCount == 1 || (rectCount == 2 && (rectArray[1].maxX < rectArray[0].maxX)) { path.addRect(rectArray[0].insetBy(dx: cornerRadius, dy: cornerRadius)) if rectCount == 2 { path.addRect(rectArray[1].insetBy(dx: cornerRadius, dy: cornerRadius)) } } else { let lastRect = rectCount - 1 path.move(to: CGPoint(x: rectArray[0].minX + cornerRadius, y: rectArray[0].maxY + cornerRadius)) path.addLine(to: CGPoint(x: rectArray[0].minX + cornerRadius, y: rectArray[0].minY + cornerRadius)) path.addLine(to: CGPoint(x: rectArray[0].maxX - cornerRadius, y: rectArray[0].minY + cornerRadius)) path.addLine(to: CGPoint(x: rectArray[0].maxX - cornerRadius, y: rectArray[lastRect].minY - cornerRadius)) path.addLine(to: CGPoint(x: rectArray[lastRect].maxX - cornerRadius, y: rectArray[lastRect].minY - cornerRadius)) path.addLine(to: CGPoint(x: rectArray[lastRect].maxX - cornerRadius, y: rectArray[lastRect].maxY - cornerRadius)) path.addLine(to: CGPoint(x: rectArray[lastRect].minX + cornerRadius, y: rectArray[lastRect].maxY - cornerRadius)) path.addLine(to: CGPoint(x: rectArray[lastRect].minX + cornerRadius, y: rectArray[0].maxY + cornerRadius)) path.closeSubpath() } color.set() let ctx = UIGraphicsGetCurrentContext() ctx!.setLineWidth(cornerRadius * 2.0) ctx!.setLineJoin(.round) ctx!.setAllowsAntialiasing(true) ctx!.setShouldAntialias(true) ctx!.addPath(path) ctx!.drawPath(using: .fillStroke) } }