2015-08-17 60 views
0

我想設置標籤第一行的寬度,然後小於其餘的行。標籤的第一行的不同寬度iOS

就像在圖像 - 由於日期,它需要更短。 我該怎麼做?

Label with different first line width

+1

可以使用NSMutableAttributedString設置不同的字體大小。 – user4261201

+0

看來人們可能會誤解你。你在尋找'不同的字體大小'還是'不同的線條長度'? – ULazdins

+0

@ULazdins不同的行長 – user2565076

回答

2

假設你的目標iOS7或以上,你可以使用引入的非常方便的排除路徑與TextKit。

NSTextContainer(通過UITextViewtextContainer屬性訪問)提供了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]; 

就是這樣!在斯威夫特


完整的示例(從遊樂場,因爲我複製/粘貼它):

// 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'上都不可用。但是,通過將'editable'和'selectable'設置爲'NO',您應該可以互換使用'UITextView'來進行純顯示。 –

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)]; 

這是其中U可以指定第一行的方式(靜止在長度suppsose 20個charecters)是在14的字體大小,和的其餘部分作爲一個更大的尺寸。

消除類似的功能,爲字符串的其餘部分創建另一個attributesString。 現在將這兩個歸屬字符串合併爲一個歸屬字符串。寫 myLabel.attributedText = myTotalAttributedText

或者你可以通過這個核心文本教程,通過它可以得到這個相同的理想效果Link

+1

好吧,OP不希望在相同的文本中包含(小)時間刺痛,而只是排除這個區域。 –

+0

是的,我回答了,記住這一點,歸屬測試第一部分沒有日期,第二部分也是如此。 –

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; 
+0

請勿使用'%c'。爲'unichar'使用'%C'。 – rmaddy

+0

這增加了每個單獨字符的長度,並沒有考慮任何間距/字距。測試整個子串的長度直到當前位置會更好。 – rmaddy