Как сделать так, чтобы UILabel отображал выделенный текст? - PullRequest
98 голосов
/ 09 июля 2009

Все, что я хочу, это черная граница в один пиксель вокруг моего белого текста UILabel.

Я дошел до подкласса UILabel с приведенным ниже кодом, который я неуклюже собрал воедино из нескольких косвенно связанных онлайн примеров. И это работает, но это очень, очень медленно (кроме симулятора), и я не мог заставить его также центрировать текст по вертикали (поэтому я жестко закодировал значение y в последней строке). Ааааа!

void ShowStringCentered(CGContextRef gc, float x, float y, const char *str) {
    CGContextSetTextDrawingMode(gc, kCGTextInvisible);
    CGContextShowTextAtPoint(gc, 0, 0, str, strlen(str));
    CGPoint pt = CGContextGetTextPosition(gc);

    CGContextSetTextDrawingMode(gc, kCGTextFillStroke);

    CGContextShowTextAtPoint(gc, x - pt.x / 2, y, str, strlen(str));
}


- (void)drawRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGRect viewBounds = self.bounds;

    CGContextTranslateCTM(theContext, 0, viewBounds.size.height);
    CGContextScaleCTM(theContext, 1, -1);

    CGContextSelectFont (theContext, "Helvetica", viewBounds.size.height,  kCGEncodingMacRoman);

    CGContextSetRGBFillColor (theContext, 1, 1, 1, 1);
    CGContextSetRGBStrokeColor (theContext, 0, 0, 0, 1);
    CGContextSetLineWidth(theContext, 1.0);

    ShowStringCentered(theContext, rect.size.width / 2.0, 12, [[self text] cStringUsingEncoding:NSASCIIStringEncoding]);
}

У меня просто ноющее чувство, что я упускаю простой способ сделать это. Возможно, переопределив «drawTextInRect», но я не могу заставить drawTextInRect согнуться под мою волю, несмотря на то, что пристально смотрю на него и хмуро нахмуриваюсь.

Ответы [ 14 ]

0 голосов
/ 12 мая 2019

также возможно создать подкласс UILabel со следующей логикой:

- (void)setText:(NSString *)text {
    [self addOutlineForAttributedText:[[NSAttributedString alloc] initWithString:text]];
}

- (void)setAttributedText:(NSAttributedString *)attributedText {
    [self addOutlineForAttributedText:attributedText];
}

- (void)addOutlineForAttributedText:(NSAttributedString *)attributedText {
    NSDictionary *strokeTextAttributes = @{
                                           NSStrokeColorAttributeName: [UIColor blackColor],
                                           NSStrokeWidthAttributeName : @(-2)
                                           };

    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrStr addAttributes:strokeTextAttributes range:NSMakeRange(0, attrStr.length)];

    super.attributedText = attrStr;
}

и если вы установите текст в раскадровке, то:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    self = [super initWithCoder:aDecoder];
    if (self) {
        // to apply border for text from storyboard
        [self addOutlineForAttributedText:[[NSAttributedString alloc] initWithString:self.text]];
    }
    return self;
}
0 голосов
/ 16 апреля 2019

Вот еще один ответ для установки выделенного текста на этикетке.

extension UILabel {

func setOutLinedText(_ text: String) {
    let attribute : [NSAttributedString.Key : Any] = [
        NSAttributedString.Key.strokeColor : UIColor.black,
        NSAttributedString.Key.foregroundColor : UIColor.white,
        NSAttributedString.Key.strokeWidth : -2.0,
        NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 12)
        ] as [NSAttributedString.Key  : Any]

    let customizedText = NSMutableAttributedString(string: text,
                                                   attributes: attribute)
    attributedText = customizedText
 }

}

установить выделенный текст, просто используя метод расширения.

lblTitle.setOutLinedText("Enter your email address or username")
0 голосов
/ 25 августа 2010

Чтобы поместить рамку с закругленными краями вокруг UILabel, я делаю следующее:

labelName.layer.borderWidth = 1;
labelName.layer.borderColor = [[UIColor grayColor] CGColor];
labelName.layer.cornerRadius = 10;

(не забудьте включить QuartzCore / QuartzCore.h)

0 голосов
/ 09 июля 2009

Почему бы вам не создать рамку UIView размером 1px в Photoshop, а затем установить UIView с изображением и расположить его позади UILabel?

Код:

UIView *myView;
UIImage *imageName = [UIImage imageNamed:@"1pxBorderImage.png"];
UIColor *tempColour = [[UIColor alloc] initWithPatternImage:imageName];
myView.backgroundColor = tempColour;
[tempColour release];

Это спасет вас от создания подкласса объекта, и это довольно просто сделать.

Не говоря уже о том, хотите ли вы сделать анимацию, она встроена в класс UIView.

...