UILabel에서 줄 간격을 제어하는 방법
한 줄에 여러 줄에 넣을 때 텍스트 사이의 간격을 줄일 수 있습니까?UILabel
프레임, 글꼴 크기, 줄 수를 설정할 수 있습니다.나는 그 라벨의 두 줄 사이의 간격을 줄이고 싶다.
Xcode 6에서는 스토리보드에서 다음과 같이 할 수 있습니다.
저는 이 대답에 뭔가 새로운 것을 더할까 생각했기 때문에 그렇게 기분 나쁘지는 않아요.다음은 Swift의 답변입니다.
import Cocoa
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 40
let attrString = NSMutableAttributedString(string: "Swift Answer")
attrString.addAttribute(.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
var tableViewCell = NSTableCellView()
tableViewCell.textField.attributedStringValue = attrString
"간단한 답변: 할 수 없습니다.텍스트 행 사이의 간격을 변경하려면 UILabel을 서브클래스로 하여 독자적인 drawTextInRect를 롤하거나 여러 개의 라벨을 작성해야 합니다."
이것은 매우 오래된 대답이며, 다른 사람들은 이미 이 문제를 해결하기 위한 새롭고 더 나은 방법을 추가했습니다.아래에 제시된 최신 답변을 참조하십시오.
iOS 6부터는 UILabel에 속성 문자열을 설정할 수 있습니다.다음 사항을 확인합니다.
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:label.text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
[attributedString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, label.text.length)];
label.attributedText = attributedString;
여기에 기재된 해결방법은 나에게 효과가 없었다.iOS 6 NSAttributeString에서는 조금 다른 방법을 찾았습니다.
myLabel.numberOfLines = 0;
NSString* string = @"String with line one. \n Line two. \n Line three.";
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.minimumLineHeight = 30.f;
style.maximumLineHeight = 30.f;
NSDictionary *attributtes = @{NSParagraphStyleAttributeName : style,};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:string
attributes:attributtes];
[myLabel sizeToFit];
인터페이스 빌더(Storyboard/X)에서IB):
프로그래밍 방식:
스위치 4
라벨 확장자 사용
extension UILabel {
// Pass value for any one of both parameters and see result
func setLineSpacing(lineSpacing: CGFloat = 0.0, lineHeightMultiple: CGFloat = 0.0) {
guard let labelText = self.text else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
paragraphStyle.lineHeightMultiple = lineHeightMultiple
let attributedString:NSMutableAttributedString
if let labelattributedText = self.attributedText {
attributedString = NSMutableAttributedString(attributedString: labelattributedText)
} else {
attributedString = NSMutableAttributedString(string: labelText)
}
// Line spacing attribute
attributedString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
self.attributedText = attributedString
}
}
콜 내선 기능
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
// Pass value for any one argument - lineSpacing or lineHeightMultiple
label.setLineSpacing(lineSpacing: 2.0) . // try values 1.0 to 5.0
// or try lineHeightMultiple
//label.setLineSpacing(lineHeightMultiple = 2.0) // try values 0.5 to 2.0
또는 라벨 인스턴스 사용(이 코드를 복사하여 실행하기만 하면 결과를 확인할 수 있습니다.
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
// Line spacing attribute
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
// Character spacing attribute
attrString.addAttribute(NSAttributedStringKey.kern, value: 2, range: NSMakeRange(0, attrString.length))
label.attributedText = attrString
스위프트 3
let label = UILabel()
let stringValue = "How to\ncontrol\nthe\nline spacing\nin UILabel"
let attrString = NSMutableAttributedString(string: stringValue)
var style = NSMutableParagraphStyle()
style.lineSpacing = 24 // change line spacing between paragraph like 36 or 48
style.minimumLineHeight = 20 // change line spacing between each line like 30 or 40
attrString.addAttribute(NSParagraphStyleAttributeName, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
label.attributedText = attrString
다음과 같은 간단한 확장을 통해 매우 효과적으로 작동합니다.
extension UILabel {
func setLineHeight(lineHeight: CGFloat) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString()
if (self.attributedText != nil) {
attrString.append( self.attributedText!)
} else {
attrString.append( NSMutableAttributedString(string: self.text!))
attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
}
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
}
이것을 파일로 복사하면 이렇게 사용할 수 있습니다.
myLabel.setLineHeight(0.7)
iOS 6에는 다른 답이 있습니다.그것은, 「아트리뷰트」를 설정하는 것입니다.적절한 문단 스타일을 가진 NSAttributedString을 사용하는 라벨의 텍스트.NSAttribedString에서의 회선 높이에 대한 자세한 내용은 다음 스택오버플로우 답변을 참조해 주세요.
핵심 텍스트 - NSAttribedString 행 높이는 완료되었습니까?
다음 클래스는 UILabel을 서브클래스로 하여 회선높이 속성을 갖는 클래스입니다.
Dark Dust에서 영감을 받아 Swift 및 기능으로서
// Usage: setTextWithLineSpacing(myEpicUILabel,text:"Hello",lineSpacing:20)
func setTextWithLineSpacing(label:UILabel,text:String,lineSpacing:CGFloat)
{
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lineSpacing
let attrString = NSMutableAttributedString(string: text)
attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
label.attributedText = attrString
}
@Mike의 답변에 따르면,lineHeightMultiple
중요한 포인트입니다.다음의 예에서는, 이 기능이 유효합니다.
NSString* text = label.text;
CGFloat textWidth = [text sizeWithAttributes:@{NSFontAttributeName: label.font}].width;
if (textWidth > label.frame.size.width) {
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentCenter;
paragraph.lineSpacing = 1.0f;
paragraph.lineHeightMultiple = 0.75; // Reduce this value !!!
NSMutableAttributedString* attrText = [[NSMutableAttributedString alloc] initWithString:text];
[attrText addAttribute:NSParagraphStyleAttributeName value:paragraph range:NSMakeRange(0, text.length)];
label.attributedText = attrText;
}
SWIFT 3 의 편리한 확장 기능은, 회선간의 공간을 보다 간단하게 설정할 수 있습니다. : )
extension UILabel
{
func setLineHeight(lineHeight: CGFloat)
{
let text = self.text
if let text = text
{
let attributeString = NSMutableAttributedString(string: text)
let style = NSMutableParagraphStyle()
style.lineSpacing = lineHeight
attributeString.addAttribute(NSParagraphStyleAttributeName,
value: style,
range: NSMakeRange(0, text.characters.count))
self.attributedText = attributeString
}
}
}
실제 라인 높이(계수가 아님)를 설정할 수 있는 방법을 찾았습니다.또, 인터페이스 빌더에서도 라이브로 렌더링 할 수 있습니다.아래 지시사항을 따르십시오.코드는 Swift 4로 작성되어 있습니다.
순서 #1: 파일 생성:DesignableLabel.swift
다음 코드를 삽입합니다.
import UIKit
@IBDesignable
class DesignableLabel: UILabel {
@IBInspectable var lineHeight: CGFloat = 20 {
didSet {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = lineHeight
paragraphStyle.maximumLineHeight = lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString(string: text!)
attrString.addAttribute(NSAttributedStringKey.font, value: font, range: NSRange(location: 0, length: attrString.length))
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attrString.length))
attributedText = attrString
}
}
}
순서 2: 배치UILabel
를 IB로 합니다.DesignableLabel
빌드될 해야 합니다 프로젝트가 빌드될 때까지 기다립니다(빌드는 성공해야 합니다!).
3단계: 이제 속성 창에 "Line Height"라는 새 속성이 표시됩니다.원하는 값을 설정하기만 하면 결과를 바로 볼 수 있습니다!
UILabel을 .lineHeightMultiple
텍스트가 잘리지 않을 정도로 고유 높이가 충분히 큰지 확인합니다.
@IBDesignable
class Label: UILabel {
override var intrinsicContentSize: CGSize {
var size = super.intrinsicContentSize
let padding = (1.0 - lineHeightMultiple) * font.pointSize
size.height += padding
return size
}
override var text: String? {
didSet {
updateAttributedText()
}
}
@IBInspectable var lineHeightMultiple: CGFloat = 1.0 {
didSet {
updateAttributedText()
}
}
private func updateAttributedText() {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = lineHeightMultiple
attributedText = NSAttributedString(string: text ?? "", attributes: [
.font: font,
.paragraphStyle: paragraphStyle,
.foregroundColor: textColor
])
invalidateIntrinsicContentSize()
}
}
Swift 3 확장:
import UIKit
extension UILabel {
func setTextWithLineSpacing(text: String, lineHeightMultiply: CGFloat = 1.3) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineHeightMultiple = lineHeightMultiply
paragraphStyle.alignment = .center
let attributedString = NSMutableAttributedString(string: text)
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
self.attributedText = attributedString
}
}
Swift 2.0에서는...
확장자 추가:
extension UIView {
func attributesWithLineHeight(font: String, color: UIColor, fontSize: CGFloat, kern: Double, lineHeightMultiple: CGFloat) -> [String: NSObject] {
let titleParagraphStyle = NSMutableParagraphStyle()
titleParagraphStyle.lineHeightMultiple = lineHeightMultiple
let attribute = [
NSForegroundColorAttributeName: color,
NSKernAttributeName: kern,
NSFontAttributeName : UIFont(name: font, size: fontSize)!,
NSParagraphStyleAttributeName: titleParagraphStyle
]
return attribute
}
}
이제 UILabel을 속성으로 설정합니다.텍스트:
self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))
필요 없는 파라미터도 많이 추가했습니다.자유롭게 다시 쓰세요.여러 가지 답을 찾고 있었어요.다른 사람에게 도움이 될지도 모르니까 전체 확장자를 올리려고 했어요.- rab
Swift3 - UITextView 또는 UILabel 확장에서 다음 함수를 추가합니다.
뷰에서 이미 속성 문자열을 사용하고 있는 경우(덮어쓰기 대신) 현재 속성 텍스트를 유지하기 위해 코드를 추가했습니다.
func setLineHeight(_ lineHeight: CGFloat) {
guard let text = self.text, let font = self.font else { return }
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = lineHeight
paragraphStyle.alignment = self.textAlignment
var attrString:NSMutableAttributedString
if let attributed = self.attributedText {
attrString = NSMutableAttributedString(attributedString: attributed)
} else {
attrString = NSMutableAttributedString(string: text)
attrString.addAttribute(NSFontAttributeName, value: font, range: NSMakeRange(0, attrString.length))
}
attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
또 다른 답은...프로그래밍 방식으로 문자열을 전달할 경우 일반 문자열 대신 속성 문자열을 전달하고 스타일을 변경해야 합니다. (iOS10)
NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] initWithString:@"Your \nregular \nstring"];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:4];
[attrString addAttribute:NSParagraphStyleAttributeName
value:style
range:NSMakeRange(0, attrString.length)];
_label.attributedText = attrString;
이게 도움이 될 거야그런 다음 스토리보드 내의 이 커스텀클래스에 라벨을 할당하고 속성 내에서 해당 파라미터를 직접 사용할 수 있습니다.
open class SpacingLabel : UILabel {
@IBInspectable open var lineHeight:CGFloat = 1 {
didSet {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = self.lineHeight
paragraphStyle.alignment = self.textAlignment
let attrString = NSMutableAttributedString(string: self.text!)
attrString.addAttribute(NSAttributedStringKey.font, value: self.font, range: NSMakeRange(0, attrString.length))
attrString.addAttribute(NSAttributedStringKey.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attrString.length))
self.attributedText = attrString
}
}
}
Swift 4 라벨 확장.어트리뷰트 텍스트에 필요한 추가 Atribute가 있는 경우 기능을 수행하기 전에 NSMutableAttributedString을 만듭니다.
extension UILabel {
func setLineHeightMultiple(to height: CGFloat, withAttributedText attributedText: NSMutableAttributedString) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = height
paragraphStyle.alignment = textAlignment
attributedText.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedText.length - 1))
self.attributedText = attributedText
}
}
이 코드는 나에게 유효합니다(ios 7 및 ios 8은 확실합니다).
_label.numberOfLines=2;
_label.textColor=[UIColor whiteColor];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineHeightMultiple=0.5;
paragraphStyle.alignment = NSTextAlignmentCenter;
paragraphStyle.lineSpacing = 1.0;
NSDictionary *nameAttributes=@{
NSParagraphStyleAttributeName : paragraphStyle,
NSBaselineOffsetAttributeName:@2.0
};
NSAttributedString *string=[[NSAttributedString alloc] initWithString:@"22m\nago" attributes:nameAttributes];
_label.attributedText=string;
여기 신속한 해결책이 있습니다.서브클래스는 Attributed 양쪽 모두에 대해 동작해야 합니다.문자 및 문자 속성 및 문자 간격 + 줄 간격.새 문자열 또는 attributedString이 설정된 경우 공백이 유지됩니다.
open class UHBCustomLabel : UILabel {
@IBInspectable open var characterSpacing:CGFloat = 1 {
didSet {
updateWithSpacing()
}
}
@IBInspectable open var lines_spacing:CGFloat = -1 {
didSet {
updateWithSpacing()
}
}
open override var text: String? {
set {
super.text = newValue
updateWithSpacing()
}
get {
return super.text
}
}
open override var attributedText: NSAttributedString? {
set {
super.attributedText = newValue
updateWithSpacing()
}
get {
return super.attributedText
}
}
func updateWithSpacing() {
let attributedString = self.attributedText == nil ? NSMutableAttributedString(string: self.text ?? "") : NSMutableAttributedString(attributedString: attributedText!)
attributedString.addAttribute(NSKernAttributeName, value: self.characterSpacing, range: NSRange(location: 0, length: attributedString.length))
if lines_spacing >= 0 {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = lines_spacing
paragraphStyle.alignment = textAlignment
attributedString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
}
super.attributedText = attributedString
}
}
언급URL : https://stackoverflow.com/questions/5494498/how-to-control-the-line-spacing-in-uilabel
'source' 카테고리의 다른 글
Windows에서 명령줄을 사용하여 사용자에게 디렉토리에 대한 권한을 부여하려면 어떻게 해야 합니까? (0) | 2023.04.16 |
---|---|
Swift를 사용하여 이미지 크기를 조정하는 방법UI? (0) | 2023.04.16 |
Git 저장소에서 삭제된 파일을 찾아서 복원하려면 어떻게 해야 하나요? (0) | 2023.04.16 |
렌더링 시간과 성능 측면에서 패널이 가장 효율적인 순서는 무엇입니까? (0) | 2023.04.16 |
치명적 오류: 클래스에 구현되지 않은 이니셜라이저 'init(코더:)'을 사용합니다. (0) | 2023.04.16 |