UILabel의 실제 줄 수를 찾는 방법은 무엇입니까?
a 및 a로 초기화 한 후 a 의 실제 줄 수를 어떻게 찾을 수 있습니까? 속성을로 설정 했으므로 필요한만큼 확장됩니다. 그러나 내가 설정 한 후 마침내 몇 줄을 얻었는지 어떻게 알 수 있습니까?UILabeltextfontnumberOfLines0text
나는 비슷한 질문을 찾았지만 간결한 대답을 제공하는 것은없는 것 같으며 boundingRectWithSize또는 sizeWithFont, ...로 저글링하는 오버 헤드없이 쉽게 얻을 수있을 것 같습니다 .
먼저 UILabel에서 텍스트 설정
첫 번째 옵션 :
먼저 글꼴에 따라 텍스트 높이를 계산합니다.
NSInteger lineCount = 0;
CGSize labelSize = (CGSize){yourLabel.frame.size.width, MAXFLOAT};
CGRect requiredSize = [self boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: yourLabel.font} context:nil];
이제 줄 수를 계산하십시오.
int charSize = lroundf(yourLabel.font.lineHeight);
int rHeight = lroundf(requiredSize.height);
lineCount = rHeight/charSize;
NSLog(@"No of lines: %i",lineCount);
두 번째 옵션 :
NSInteger lineCount = 0;
CGSize textSize = CGSizeMake(yourLabel.frame.size.width, MAXFLOAT);
int rHeight = lroundf([yourLabel sizeThatFits:textSize].height);
int charSize = lroundf(yourLabel.font.lineHeight);
lineCount = rHeight/charSize;
NSLog(@"No of lines: %i",lineCount);
이것들 중 어느 것도 나를 위해 일하지 않았습니다. 하나 아래는
Swift 4.2 :
extension UILabel {
func calculateMaxLines() -> Int {
let maxSize = CGSize(width: frame.size.width, height: CGFloat(Float.infinity))
let charSize = font.lineHeight
let text = (self.text ?? "") as NSString
let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
let linesRoundedUp = Int(ceil(textSize.height/charSize))
return linesRoundedUp
}
}
Swift 4 / 4.1 :
extension UILabel {
func calculateMaxLines() -> Int {
let maxSize = CGSize(width: frame.size.width, height: CGFloat(Float.infinity))
let charSize = font.lineHeight
let text = (self.text ?? "") as NSString
let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil)
let linesRoundedUp = Int(ceil(textSize.height/charSize))
return linesRoundedUp
}
}
스위프트 3 :
extension UILabel {
func calculateMaxLines() -> Int {
let maxSize = CGSize(width: frame.size.width, height: CGFloat(Float.infinity))
let charSize = font.lineHeight
let text = (self.text ?? "") as NSString
let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
let linesRoundedUp = Int(ceil(textSize.height/charSize))
return linesRoundedUp
}
}
Swift 5 (IOS 12.2)
레이블이 잘림없이 텍스트를 렌더링하는 데 필요한 최대 줄 수를 가져옵니다.
extension UILabel {
var maxNumberOfLines: Int {
let maxSize = CGSize(width: frame.size.width, height: CGFloat(MAXFLOAT))
let text = (self.text ?? "") as NSString
let textHeight = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).height
let lineHeight = font.lineHeight
return Int(ceil(textHeight / lineHeight))
}
}
제한된 경계를 사용하여 레이블에 최대 줄 수를 표시 할 수 있습니다. 레이블에 텍스트를 할당 한 후이 속성을 사용합니다.
extension UILabel {
var numberOfVisibleLines: Int {
let maxSize = CGSize(width: frame.size.width, height: CGFloat(MAXFLOAT))
let textHeight = sizeThatFits(maxSize).height
let lineHeight = font.lineHeight
return Int(ceil(textHeight / lineHeight))
}
}
용법
print(yourLabel.maxNumberOfLines)
print(yourLabel.numberOfVisibleLines)
@Paresh 솔루션 의 빠른 버전 은 다음과 같습니다 .
func lines(label: UILabel) -> Int {
let textSize = CGSize(width: label.frame.size.width, height: CGFloat(Float.infinity))
let rHeight = lroundf(Float(label.sizeThatFits(textSize).height))
let charSize = lroundf(Float(label.font.lineHeight))
let lineCount = rHeight/charSize
return lineCount
}
편집 : 이유를 모르겠지만 코드가 실제 줄 수보다 2 줄을 더 반환하고 있습니다. 제 솔루션의 경우 lineCount를 반환하기 전에 빼기 만했습니다.
여기의 다른 답변 은 0이 아닌 다른 값으로 설정된 경우 의 numberOfLines속성을 존중하지 않습니다 UILabel.
카테고리 또는 하위 클래스에 추가 할 수있는 또 다른 옵션은 다음과 같습니다.
- (NSUInteger)lineCount
{
CGSize size = [self sizeThatFits:CGSizeMake(self.frame.size.width, CGFLOAT_MAX)];
return MAX((int)(size.height / self.font.lineHeight), 0);
}
몇 가지 참고 사항 :
- 실제로
font속성을 설정하지 않고 특성 텍스트가있는 UILabel에서 이것을 사용 하고 있으며 제대로 작동합니다. .NET Framework에서 여러 글꼴을 사용하는 경우 분명히 문제가 발생할 것attributedText입니다. UILabel사용자 정의 가장자리 삽입을 갖도록 서브 클래 싱 하는 경우 (예를 들어 여기drawTextInRect:에서 찾은 깔끔한 트릭 인 을 재정 의하여 ) 위를 계산할 때 해당 삽입을 고려하는 것을 기억해야합니다 . 예를 들면 :sizeCGSizeMake(self.frame.size.width - (self.insets.left + self.insets.right), CGFLOAT_MAX)
여기 Swift3 코드가 있습니다. Int 값을 정의하고 (MAXFLOAT)를 사용하여 텍스트 크기의 높이를 얻을 수 있으며 해당 높이를 사용하여 UILabel의 총 높이를 얻을 수 있으며 문자 크기로 총 높이를 구해 실제 줄을 얻을 수 있습니다 UILabel의 수입니다.
var lineCount: Int = 0
var textSize = CGSize(width: CGFloat(yourLabel.frame.size.width), height: CGFloat(MAXFLOAT))
var rHeight: Int = lroundf(yourLabel.sizeThatFits(textSize).height)
var charSize: Int = lroundf(yourLabel.font.leading)
lineCount = rHeight / charSize
print("No of lines: \(lineCount)")
@Prince의 답변에 이어 이제 다음과 같이 카테고리 를 구현했습니다 UILabel(코드 컴파일을 허용하지 않는 그의 답변에서 사소한 구문 오류를 수정했습니다).
UILabel + Util.h
#import <UIKit/UIKit.h>
@interface UILabel (Util)
- (NSInteger)lineCount;
@end
UILabel + Util.,
#import "UILabel+Util.h"
@implementation UILabel (Util)
- (NSInteger)lineCount
{
// Calculate height text according to font
NSInteger lineCount = 0;
CGSize labelSize = (CGSize){self.frame.size.width, FLT_MAX};
CGRect requiredSize = [self.text boundingRectWithSize:labelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: self.font} context:nil];
// Calculate number of lines
int charSize = self.font.leading;
int rHeight = requiredSize.size.height;
lineCount = rHeight/charSize;
return lineCount;
}
@end
사용자 지정 레이블에서 사용 가능한 총 줄 수를 찾을 수 있습니다.이 코드를 확인하십시오 ...
NSInteger numberOfLines = [self lineCountForText:@"YOUR TEXT"];
- (int)lineCountForText:(NSString *) text
{
UIFont *font = [UIFont systemFontOfSize: 15.0];
int width=Your_LabelWidht;
CGRect rect = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : font} context:nil];
return ceil(rect.size.height / font.lineHeight);
}
공식 개발자 웹 사이트 에서 Objc 의 텍스트 줄 계산 솔루션 하나를 언급 한 것 같습니다 . 그러나 레이아웃 관리자, 텍스트 저장소 및 텍스트 컨테이너로 구성된 텍스트보기에 대한 참조가 있다고 가정합니다. 불행히도 UILabel은 그것들을 우리에게 노출하지 않으므로 UILabel과 동일한 구성으로 만들어야합니다.
Objc 코드를 다음과 같이 신속하게 번역했습니다. 나를 위해 잘 작동하는 것 같습니다.
extension UILabel {
var actualNumberOfLines: Int {
let textStorage = NSTextStorage(attributedString: self.attributedText!)
let layoutManager = NSLayoutManager()
textStorage.addLayoutManager(layoutManager)
let textContainer = NSTextContainer(size: self.bounds.size)
textContainer.lineFragmentPadding = 0
textContainer.lineBreakMode = self.lineBreakMode
layoutManager.addTextContainer(textContainer)
let numberOfGlyphs = layoutManager.numberOfGlyphs
var numberOfLines = 0, index = 0, lineRange = NSMakeRange(0, 1)
while index < numberOfGlyphs {
layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
numberOfLines += 1
}
return numberOfLines
}
}
Xamarin.iOS
Thanks to the answers everyone provided above.
This gets number of visible lines.
public static int VisibleLineCount(this UILabel label)
{
var textSize = new CGSize(label.Frame.Size.Width, nfloat.MaxValue);
nfloat rHeight = label.SizeThatFits(textSize).Height;
nfloat charSize = label.Font.LineHeight;
return Convert.ToInt32(rHeight / charSize);
}
This gets actual number of lines the text will occupy on screen.
public static int LineCount(this UILabel label)
{
var maxSize = new CGSize(label.Frame.Size.Width, nfloat.MaxValue);
var charSize = label.Font.LineHeight;
var text = (label.Text ?? "").ToNSString();
var textSize = text.GetBoundingRect(maxSize, NSStringDrawingOptions.UsesLineFragmentOrigin, new UIStringAttributes() { Font = label.Font }, null);
return Convert.ToInt32(textSize.Height / charSize);
}
A helper method I find useful for my use case.
public static bool IsTextTruncated(this UILabel label)
{
if (label.Lines == 0)
{
return false;
}
return (label.LineCount() > label.Lines);
}
To get a more accurate line count:
- Use
font.lineHeightinstead offont.pointSize - round() the line count after division
let l = UILabel()
l.numberOfLines = 0
l.layer.frame.size.width = self.view.frame.width - 40 /*padding(20 + 20)*/
l.font = UIFont(name: "BwModelica-Bold", size: 16.0)
l.text = "Random Any length Text!!"
let noOfLines = ceil(l.intrinsicContentSize.width) / l.frame.width)
let lbl_height = noOfLines * l.intrinsicContentSize.height
This will be your Exact dynamic height of Label and Number of lines. Happy coding!!!
Note that @kurt-j's answer will not always work. In some cases, you will have to manually provide the width of label. Since these cases exist, it is a good idea to have an optional width parameter, even if you don't end up using it.
Swift 4.2:
extension UILabel {
func calculateMaxLines(actualWidth: CGFloat?) -> Int {
var width = frame.size.width
if let actualWidth = actualWidth {
width = actualWidth
}
let maxSize = CGSize(width: width, height: CGFloat(Float.infinity))
let charSize = font.lineHeight
let text = (self.text ?? "") as NSString
let textSize = text.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
let linesRoundedUp = Int(ceil(textSize.height/charSize))
return linesRoundedUp
}
}
Xamarin iOS
label.Text = text;
var lineCount = 0;
var textSize = new CGSize(label.Frame.Size.Width, float.MaxValue);
var height = label.SizeThatFits(textSize).Height;
var fontHeight = label.Font.LineHeight;
lineCount = Convert.ToInt32(height / fontHeight);
참고URL : https://stackoverflow.com/questions/28108745/how-to-find-actual-number-of-lines-of-uilabel
'IT Share you' 카테고리의 다른 글
| GDB로 메모리 범위를 분해하는 방법은 무엇입니까? (0) | 2020.12.09 |
|---|---|
| 퍼지 문자열 비교 (0) | 2020.12.09 |
| jquery 애니메이션 배경 위치 (0) | 2020.12.09 |
| UIPanGestureRecognizer를 사용하여 패닝되는 방향을 어떻게 캡처 할 수 있습니까? (0) | 2020.12.09 |
| UITableView를 특정 위치로 스크롤하는 방법 (0) | 2020.12.09 |