UILabel의 실제 줄 수를 찾는 방법은 무엇입니까?
a 및 a로 초기화 한 후 a 의 실제 줄 수를 어떻게 찾을 수 있습니까? 속성을로 설정 했으므로 필요한만큼 확장됩니다. 그러나 내가 설정 한 후 마침내 몇 줄을 얻었는지 어떻게 알 수 있습니까?UILabel
text
font
numberOfLines
0
text
나는 비슷한 질문을 찾았지만 간결한 대답을 제공하는 것은없는 것 같으며 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:
에서 찾은 깔끔한 트릭 인 을 재정 의하여 ) 위를 계산할 때 해당 삽입을 고려하는 것을 기억해야합니다 . 예를 들면 :size
CGSizeMake(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.lineHeight
instead 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 |