2015-08-17 5 views
0

Я хочу установить ширину первой строки метки, чтобы она была меньше остальных строк.Разная ширина первой строки метки iOS

Как на картинке - из-за даты, она должна быть короче. Как я могу это сделать?

Label with different first line width

+1

Вы можете использовать NSMutableAttributedString для установки разные размеры шрифта. – user4261201

+0

Кажется, что люди могут ошибиться. Вы ищете «разные размеры шрифта» или «разные длины строк»? – ULazdins

+0

@ULazdins разные длины строк – user2565076

ответ

2

Предполагая, что вы ориентируетесь iOS7 или выше, вы можете использовать очень удобные пути исключения введенные с TextKit.

NSTextContainer (доступен через UITextView «s textContainer собственности) обеспечивает exclusionPaths свойство, которое можно установить на один или несколько UIBezierPath с представляющими районы, где текст должен обтекать.

Итак, сначала вам нужно определить прямоугольник, в котором вы не хотите видеть какой-либо текст (в вашем случае, метка времени + некоторое заполнение, я думаю). Обратите внимание, что нам нужен этот прямоугольник в системе координат точки зрения текста, так что вы, возможно, потребуется преобразовать, например:

CGRect timeLabelRect = [self.timeLabel convertRect:self.timeLabel.bounds toView:self.textView]; 
CGRect exclusionRect = CGRectInset(timeLabelRect, -10.f, -10.f); // add padding 

После того, как мы имеем, что прямоугольник, это просто вопрос о создании путь от него и установив его как путь исключения (только) в текстовом контейнере текстового вида:

UIBezierPath *path = [UIBezierPath bezierPathWithRect:exclusionRect]; 
self.textView.textContainer.exclusionPaths = @[path]; 

Всё!


Полный пример Swift (потому что я копировать/вставить его с Playground):

// just a plain container view 
var container = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 400)) 

// the text view 
var textView = UITextView(frame: CGRect(x: 0, y: 100, width: 300, height: 300)) 
textView.text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet." 
container.addSubview(textView) 

// a box (representing the time label in your case) 
var blueBox = UIView(frame: CGRect(x: 250, y: 100, width: 50, height: 50)) 
blueBox.backgroundColor = .blueColor() 
container.addSubview(blueBox) 

На данный момент это выглядит следующим образом:

before exclusion path

Теперь, давайте просто добавьте путь исключения:

// configure exclusion path 
let blueBoxRect = textView.convertRect(blueBox.bounds, fromView: blueBox) 
let path = UIBezierPath(rect: blueBoxRect) 
textView.textContainer.exclusionPaths = [path] 

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

after adding exclusion path

+0

Можете ли вы показать мне пример? – user2565076

+0

Я только что обновил ответ с помощью примера кода, включая полный рабочий пример в Swift (копирование/вставка с детской площадки). –

+0

А, мне, возможно, нужно указать, что все приятные материалы TextKit недоступны в 'UILabel'. Тем не менее, вы должны иметь возможность использовать 'UITextView' взаимозаменяемо для чистого отображения, устанавливая' editable' и 'selectable' в' NO'. –

0

Вы должны использовать NSAttributedString для этой цели.

NSMutableAttributedString *myAttributedString = [[NSMutableAttributedString alloc] initWithString:@"This is my text bla bla bla bla bla!"]; 
[myAttributedString addAttribute:NSFontAttributeName 
      value:[UIFont systemFontOfSize:14.0] 
      range:NSMakeRange(startingpoint, length)]; 

Это способ, в котором и можно указать первую строку (статический в длину suppsose 20 charecters), чтобы быть в размере шрифта 14, а остальная часть в качестве большего размера.

Настроить аналогичную функцию для создания другой атрибутной строки для остальной части строки. Теперь объедините те 2 атрибутаString, чтобы сформировать единый атрибутString. и написать myLabel.attributedText = myTotalAttributedText

или вы можете пройти через этот основной текст учебника, с помощью которого вы можете получить тот же самый желаемый эффект Link

+1

Ну, OP не хочет включать (меньшее) время в одном тексте, а просто исключает эту область. –

+0

Да, я ответил, учитывая это, приписанный тест 1-я часть без даты, а вторая часть тоже. –

1
UILabel *labelDate = [[UILabel alloc]initWithFrame:CGRectMake(_textView1.frame.size.width-100, 0, 100, 30)]; 
labelDate.text = @"4:32 PM"; 
[_textView1 addSubview:labelDate];//just added a sample label 

код для того, где поставить '\ п' в первой строке

int firstlineWidth = _textView1.frame.size.width - labelDate.frame.size.width; 
int eachCharWidthSum = 0; 
NSMutableString *stringToShow = [[NSMutableString alloc]init]; 
stringToShow = [_textView1.text mutableCopy]; 
int previousSpaceCharIndex = 0; 
int initialPreviousSpaceCharIndex = 0; 
BOOL isNeedNextSpace = NO; 
for (int i =0; i<_textView1.text.length; i++) 
{ 
    unichar charf = [_textView1.text characterAtIndex:i]; 
    NSString *eachString = [NSString stringWithFormat:@"%c",charf]; 
    CGSize stringSize = [eachString sizeWithFont:_textView1.font]; 
    eachCharWidthSum += stringSize.width; 
    if ([eachString isEqualToString:@" "]) 
    { 
     previousSpaceCharIndex = i; 
    } 
    int differance = i - previousSpaceCharIndex; 
    if (firstlineWidth<eachCharWidthSum&&differance<10) 
    { 
     [stringToShow insertString:@"\n" atIndex:previousSpaceCharIndex]; 
     break; 
    } 
    else if (firstlineWidth<eachCharWidthSum&&differance>10&&isNeedNextSpace==NO) 
    { 
     isNeedNextSpace = YES; 
     initialPreviousSpaceCharIndex = previousSpaceCharIndex; 
    } 
    else if (isNeedNextSpace&&initialPreviousSpaceCharIndex!=previousSpaceCharIndex) 
    { 
     /* 
     found new space char 
     */ 
     [stringToShow insertString:@"\n" atIndex:previousSpaceCharIndex]; 
     break; 
    } 
} 
_textView1.text = stringToShow; 
+0

Не используйте '% c'. Используйте '% C' для' unichar'. – rmaddy

+0

Это добавляет длину каждого отдельного символа и не учитывает никакого интервала/кернинга. Было бы намного лучше проверить длину всей подстроки до текущей позиции. – rmaddy

Смежные вопросы