我目前使用UILabel
來顯示多行文本。大多數換行符設置爲NSLineBreakByWordWrapping
,因此標籤會自動插入換行符。我如何檢測這些換行符在哪裏?基本上,我想返回一個包含每個\n
中斷的字符串。UILabel檢測換行符
回答
這是我的工作,各地用於檢測換行內UILabel
- (int)getLengthForString:(NSString *)str fromFrame:(CGRect)frame withFont:(UIFont *)font
{
int length = 1;
int lastSpace = 1;
NSString *cutText = [str substringToIndex:length];
CGSize textSize = [cutText sizeWithFont:font constrainedToSize:CGSizeMake(frame.size.width, frame.size.height + 500)];
while (textSize.height <= frame.size.height)
{
NSRange range = NSMakeRange (length, 1);
if ([[str substringWithRange:range] isEqualToString:@" "])
{
lastSpace = length;
}
length++;
cutText = [str substringToIndex:length];
textSize = [cutText sizeWithFont:font constrainedToSize:CGSizeMake(frame.size.width, frame.size.height + 500)];
}
return lastSpace;
}
-(NSString*) getLinebreaksWithString:(NSString*)labelText forWidth:(CGFloat)lblWidth forPoint:(CGPoint)point
{
//Create Label
UILabel *label = [[UILabel alloc] init];
label.text = labelText;
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
//Set frame according to string
CGSize size = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(lblWidth, MAXFLOAT)
lineBreakMode:UILineBreakModeWordWrap];
[label setFrame:CGRectMake(point.x , point.y , size.width , size.height)];
//Add Label in current view
[self.view addSubview:label];
//Count the total number of lines for the Label which has NSLineBreakByWordWrapping line break mode
int numLines = (int)(label.frame.size.height/label.font.leading);
//Getting and dumping lines from text set on the Label
NSMutableArray *allLines = [[NSMutableArray alloc] init];
BOOL shouldLoop = YES;
while (shouldLoop)
{
//Getting length of the string from rect with font
int length = [self getLengthForString:labelText fromFrame:CGRectMake(point.x, point.y, size.width, size.height/numLines) withFont:label.font] + 1;
[allLines addObject:[labelText substringToIndex:length]];
labelText = [labelText substringFromIndex:length];
if(labelText.length<length)
shouldLoop = NO;
}
[allLines addObject:labelText];
//NSLog(@"\n\n%@\n",allLines);
return [allLines componentsJoinedByString:@"\n"];
}
如何使用
NSString *labelText = @"We are what our thoughts have made us; so take care about what you think. Words are secondary. Thoughts live; they travel far.";
NSString *stringWithLineBreakChar = [self getLinebreaksWithString:labelText forWidth:200 forPoint:CGPointMake(15, 15)];
NSLog(@"\n\n%@",stringWithLineBreakChar);
你只需要設置由需要getLinebreaksWithString參數,你會獲取包含每個「\ n」中斷的字符串。
輸出
這工作。儘管在一些字符串中,我遇到了「if([[str substringtringWithRange:range] isEqualToString:@」「]) 」returned「由於未捕獲的異常'NSRangeException',原因:' - [__ NSCFString substringWithRange:] :範圍或索引超出範圍'「 – morcutt 2013-03-06 21:32:32
你可以只發布那些導致錯誤的示例字符串?可能是我可以找出 – 2013-03-07 04:07:13
@Bhargai我昨天遇到它,用RSS源測試它,但還沒有重現相同的錯誤。下次發生時,我會發布它。我感謝您的幫助! – morcutt 2013-03-07 19:51:05
這是我解決這個問題。
我遍歷所提供的字符串中的所有空白字符,將子字符串(從開始到當前空白)設置爲我的標籤,並檢查高度的差異。當高度改變時,我插入一個新的行字符(模擬一個換行符)。
func wordWrapFormattedStringFor(string: String) -> String {
// Save label state
let labelHidden = label.isHidden
let labelText = label.text
// Set text to current label and size it to fit the content
label.isHidden = true
label.text = string
label.sizeToFit()
label.layoutIfNeeded()
// Prepare array with indexes of all whitespace characters
let whitespaceIndexes: [String.Index] = {
let whitespacesSet = CharacterSet.whitespacesAndNewlines
var indexes: [String.Index] = []
string.unicodeScalars.enumerated().forEach { i, unicodeScalar in
if whitespacesSet.contains(unicodeScalar) {
let index = string.index(string.startIndex, offsetBy: i)
indexes.append(index)
}
}
// We want also the index after the last character so that when we make substrings later we include also the last word
// This index can only be used for substring to this index (not from or including, since it points to \0)
let index = string.index(string.startIndex, offsetBy: string.characters.count)
indexes.append(index)
return indexes
}()
var reformattedString = ""
let boundingSize = CGSize(width: label.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let attributes = [NSFontAttributeName: font]
var runningHeight: CGFloat?
var previousIndex: String.Index?
whitespaceIndexes.forEach { index in
let string = string.substring(to: index)
let stringHeight = string.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: attributes, context: nil).height
var newString: String = {
if let previousIndex = previousIndex {
return string.substring(from: previousIndex)
} else {
return string
}
}()
if runningHeight == nil {
runningHeight = stringHeight
}
if runningHeight! < stringHeight {
// Check that we can create a new index with offset of 1 and that newString does not contain only a whitespace (for example if there are multiple consecutive whitespaces)
if newString.characters.count > 1 {
let splitIndex = newString.index(newString.startIndex, offsetBy: 1)
// Insert a new line between the whitespace and rest of the string
newString.insert("\n", at: splitIndex)
}
}
reformattedString += newString
runningHeight = stringHeight
previousIndex = index
}
// Restore label
label.text = labelText
label.isHidden = labelHidden
return reformattedString
}
Image - Comparison of output string with label text.
該解決方案在我的情況的工作非常出色,希望它幫助。
- 1. 檢查UILabel中是否有換行符
- 2. 檢測UILabel換行符。將項目動態放入UITableViewCell中
- 3. Inputdlg不檢測換行符
- 4. UILabel中的換行符?
- 5. iPhone的UILabel與URL檢測
- 6. 在UILabel中檢測網址
- 7. PHP:URL檢測(regexp)包含換行符
- 8. 在EditText中檢測換行符
- 9. 檢測自然換行符的JavaScript
- 10. 如何在java中檢測換行符
- 11. 檢測textarea自然換行符
- 12. 在UITextView中檢測換行符
- 13. 正則表達式檢測換行符
- 14. 如何檢測XSLT中的換行符
- 15. 換行符在UILabel中不起作用
- 16. 用換行檢測TextBlock中的換行符的數量?
- 17. 檢測換頁字符
- 18. 換行符測試
- 19. 在fgets中檢測換行
- 20. Java的檢測和替換\ n換行符
- 21. 如何檢測和一個char []替換換行符?
- 22. 檢測UILabel中顯示的字符總數
- 23. 紅寶石未能檢測到字符串中的換行符
- 24. JQuery的檢測換行符的字符串
- 25. 檢測UILabel是否隱藏了另一個UILabel UIView
- 26. UILabel與NSAttributedString忽略換行
- 27. 如何檢測哪個UILabel被竊聽?
- 28. 檢測中的UILabel文本更改
- 29. 檢測UILabel上的觸摸事件
- 30. 如何檢測UILabel中的省略號?
+1好問題 – 2013-03-06 09:48:51