标签iOS

时间:2015-08-17 11:58:59

标签: ios objective-c autolayout label width

我想设置标签第一行的宽度,使其小于其余行。

与图像一样 - 由于日期,它需要更短。 我怎么能这样做?

Label with different first line width

3 个答案:

答案 0 :(得分:2)

假设您的目标是iOS7或更高版本,您可以使用TextKit引入的非常方便的排除路径。

NSTextContainer(可通过UITextView的{​​{3}}属性访问)提供textContainer属性,您可以将其设置为一个或多个UIBezierPath个表示文本应该流动的区域。

所以,首先你需要确定你不想看到任何文本的矩形(在你的情况下,时间标签+一些填充,我猜)。请注意,我们在文本视图的坐标系中需要这个rec​​t,因此您可能需要转换,例如:

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)

此时它看起来像这样:

exclusionPaths

现在,我们只需添加排除路径:

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

添加排除路径后,它看起来像这样:

before exclusion path

答案 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

代码放置' \ n'在第一行

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;

答案 2 :(得分: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)];

这是一种方法,你可以指定第一行(长度为静态,包括20个字符),字体大小为14,其余部分为更大的大小。

设置类似的函数,为字符串的其余部分创建另一个referencedString。 现在合并这两个attributedString以形成一个referencedString。和写 myLabel.attributedText = myTotalAttributedText

或者你可以通过这个核心文本教程,通过它可以获得同样的效果Link