UILabel에서 줄 간격을 제어하는 방법
에 여러 줄을 넣을 때 텍스트 사이의 간격을 줄일 수 UILabel
있습니까? 프레임, 글꼴 크기 및 줄 수를 설정할 수 있습니다. 해당 레이블의 두 줄 사이의 간격을 줄이려고합니다.
이 답변에 새로운 것을 추가하는 것에 대해 생각했기 때문에 나쁘지 않습니다 ... 여기 스위프트 답변이 있습니다.
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를 굴 리거나 여러 레이블을 만들어야합니다."
참조 : UILabel 줄 간격 설정
이것은 정말 오래된 답변이며 다른 사람들은 이미 이것을 처리하는 새롭고 더 나은 방법을 추가했습니다. 아래 제공된 최신 답변을 참조하십시오.
Xcode 6에서는 스토리 보드에서이를 수행 할 수 있습니다.
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];
이 간단한 확장 프로그램을 만들어서 매우 잘 작동했습니다.
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)
Interface Builder (Storyboard / XIB)에서 :
프로그래밍 방식으로 :
SWift 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
iOS 6에는 대체 단락 답변이 있습니다.이 단락은 적절한 단락 스타일과 함께 NSAttributedString을 사용하여 레이블에 coloredText를 설정합니다. NSAttributedString을 사용한 행 높이에 대한 자세한 내용은이 스택 오버플로 응답을 참조하십시오.
핵심 텍스트-NSAttributedString 줄 높이가 제대로 되었습니까?
다음은 줄 높이 속성을 갖도록 UILabel을 서브 클래스로 만드는 클래스입니다. https://github.com/LemonCake/MSLabel
Swift와 DarkDust에서 영감을 얻은 기능
// 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
}
}
}
실제 선 높이를 설정할 수있는 방법을 찾았으며 (인자가 아님) Interface Builder에서 실시간으로 렌더링합니다 . 아래 지침을 따르십시오. 코드는 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
스토리 보드 / XIB로하고 해당 클래스를 설정합니다 DesignableLabel
. 프로젝트가 빌드 될 때까지 기다리십시오 (빌드가 성공해야합니다!).
3 단계 : 이제 속성 창에 "Line Height"라는 새 속성이 표시됩니다. 원하는 값을 설정하면 결과가 즉시 나타납니다!
스위프트 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을 ratedText로 설정하십시오.
self.label.attributedText = NSMutableAttributedString(string: "SwiftExample", attributes: attributesWithLineHeight("SourceSans-Regular", color: UIColor.whiteColor(), fontSize: 20, kern: 2.0, lineHeightMultiple: 0.5))
분명히, 나는 당신이 필요하지 않은 많은 매개 변수를 추가했습니다. 놀러 다니십시오-메소드를 다시 작성하십시오. 여러 가지 답변을 찾고 있었으므로 누군가를 도울 수 있도록 전체 확장을 게시 할 것이라고 생각했습니다.
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;
스위프트 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
}
}
도움이 될 것입니다. 그런 다음 스토리 보드 내에서이 사용자 정의 클래스에 레이블을 지정하고 특성 내에서 직접 매개 변수를 사용할 수 있습니다.
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
}
}
}
다음은 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()
}
}
스위프트 4 라벨 확장. 해당 텍스트에 추가 속성이 필요한 경우 함수에 전달하기 전에 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;
여기 내 신속한 해결책이 있습니다. 서브 클래스는 coloredText 및 text 속성과 characterSpacing + lineSpacing 모두에서 작동해야합니다. 새 문자열 또는 ValueedString이 설정된 경우 간격을 유지합니다.
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
}
}
더 빠르고 스마트하고 간단한 해결 방법 :
줄이 많지 않은 UILabels의 경우 대신 stackView를 사용할 수 있습니다.
- 각 줄마다 새 레이블을 작성하십시오.
- 그것들을 StackView에 넣습니다. (두 레이블 모두 선택-> 편집기-> 내장-> 스택보기
Spacing
StackView를 원하는 양으로 조정하십시오.
수직 으로 쌓아 두십시오 . 이 솔루션은 사용자 정의 글꼴에도 작동합니다.
참고 URL : https://stackoverflow.com/questions/5494498/how-to-control-the-line-spacing-in-uilabel
'Programing' 카테고리의 다른 글
환경이 수정 된 Python 하위 프로세스 / Popen (0) | 2020.04.05 |
---|---|
UILabel에 줄 바꿈을 추가하는 방법? (0) | 2020.04.04 |
Invoke-customs는 Android 0부터 시작하여 지원됩니다. --min-api 26 (0) | 2020.04.04 |
거꾸로 작성된이 코드가“Hello World!”를 인쇄하는 이유는 무엇입니까? (0) | 2020.04.04 |
XML에서 '독립형'지시문의 의미는 무엇입니까? (0) | 2020.04.04 |