Я хочу установить ширину первой строки метки, чтобы она была меньше остальных строк.Разная ширина первой строки метки iOS
Как на картинке - из-за даты, она должна быть короче. Как я могу это сделать?
Я хочу установить ширину первой строки метки, чтобы она была меньше остальных строк.Разная ширина первой строки метки iOS
Как на картинке - из-за даты, она должна быть короче. Как я могу это сделать?
Предполагая, что вы ориентируетесь 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)
На данный момент это выглядит следующим образом:
Теперь, давайте просто добавьте путь исключения:
// configure exclusion path
let blueBoxRect = textView.convertRect(blueBox.bounds, fromView: blueBox)
let path = UIBezierPath(rect: blueBoxRect)
textView.textContainer.exclusionPaths = [path]
После добавления пути исключения, это выглядит следующим образом:
Можете ли вы показать мне пример? – user2565076
Я только что обновил ответ с помощью примера кода, включая полный рабочий пример в Swift (копирование/вставка с детской площадки). –
А, мне, возможно, нужно указать, что все приятные материалы TextKit недоступны в 'UILabel'. Тем не менее, вы должны иметь возможность использовать 'UITextView' взаимозаменяемо для чистого отображения, устанавливая' editable' и 'selectable' в' NO'. –
Вы должны использовать 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
Ну, OP не хочет включать (меньшее) время в одном тексте, а просто исключает эту область. –
Да, я ответил, учитывая это, приписанный тест 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;
Вы можете использовать NSMutableAttributedString для установки разные размеры шрифта. – user4261201
Кажется, что люди могут ошибиться. Вы ищете «разные размеры шрифта» или «разные длины строк»? – ULazdins
@ULazdins разные длины строк – user2565076