핵심 텍스트-NSAttributedString 줄 높이가 맞습니까?
핵심 텍스트의 줄 간격으로 완전히 어둡습니다. NSAttributedString을 사용하고 있으며 여기에 다음 특성을 지정합니다.-kCTFontAttributeName-kCTParagraphStyleAttributeName
이로부터 CTFrameSetter가 생성되고 컨텍스트에 그려집니다.
단락 스타일 속성에서 줄의 높이를 지정하고 싶습니다.
kCTParagraphStyleSpecifierLineHeightMultiple을 사용하면 텍스트가이 높이의 중간에 표시되는 대신 각 줄이 텍스트 상단에 패딩을받습니다.
kCTParagraphStyleSpecifierLineSpacing을 사용할 때 패딩이 텍스트 하단에 추가됩니다.
줄의 맨 아래 또는 맨 위에있는 텍스트 대신 해당 높이의 중간에 텍스트 (글리프)를 사용하여 지정된 줄 높이를 달성하도록 도와주세요.
CTLine 등을 명시 적으로 생성하는 경로를 따르지 않고는 이것이 가능하지 않습니까?
목표 -C
NSInteger strLength = [myString length];
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
[style setLineSpacing:24];
[attString addAttribute:NSParagraphStyleAttributeName
value:style
range:NSMakeRange(0, strLength)];
스위프트 5
let strLength = myString.length()
var style = NSMutableParagraphStyle()
style.lineSpacing = 24
attString.addAttribute(.paragraphStyle, value: style, range: NSRange(location: 0, length: strLength))
나는 여전히 내 다음 진술에 대해 100 % 확신하지는 않지만 말이되는 것 같다. 내가 틀린 부분을 수정하십시오.
선 높이 (선행)는 연속 된 유형의 선 기준선 사이의 거리를 나타냅니다. 여기서 기준선은 텍스트가 놓인 가상의 선으로 해석 될 수 있습니다.
간격은 줄 사이의 공간입니다. 텍스트 줄 뒤에 공백이 나타납니다.
내 문제에 대해 다음 솔루션을 사용했습니다.
// NOT SURE WHAT THE THEORY BEHIND THIS FACTOR IS. WAS FOUND VIA TRIAL AND ERROR.
CGFloat factor = 14.5/30.5;
CGFloat floatValues[4];
floatValues[0] = self.lineHeight * factor/(factor + 1);
floatValues[1] = self.lineHeight/(factor + 1);
floatValues[2] = self.lineHeight;
이 매트릭스는 NSAttributedString에 대한 단락 스타일 매개 변수와 함께 사용됩니다.
CTParagraphStyleSetting paragraphStyle[3];
paragraphStyle[0].spec = kCTParagraphStyleSpecifierLineSpacing;
paragraphStyle[0].valueSize = sizeof(CGFloat);
paragraphStyle[0].value = &floatValues[0];
paragraphStyle[1].spec = kCTParagraphStyleSpecifierMinimumLineHeight;
paragraphStyle[1].valueSize = sizeof(CGFloat);
paragraphStyle[1].value = &floatValues[1];
paragraphStyle[2].spec = kCTParagraphStyleSpecifierMaximumLineHeight;
paragraphStyle[2].valueSize = sizeof(CGFloat);
paragraphStyle[2].value = &floatValues[2];
CTParagraphStyleRef style = CTParagraphStyleCreate((const CTParagraphStyleSetting*) ¶graphStyle, 3);
[attributedString addAttribute:(NSString*)kCTParagraphStyleAttributeName value:(id)style range:NSMakeRange(0, [string length])];
CFRelease(style);
이것이 누군가를 돕기를 바랍니다. 더 많은 관련 정보를 발견하면이 답변을 업데이트하겠습니다.
에서 스위프트 3 :
let textFont = UIFont(name: "Helvetica Bold", size: 20)!
let textColor = UIColor(white: 1, alpha: 1) // White
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.paragraphSpacing = 20 // Paragraph Spacing
paragraphStyle.lineSpacing = 40 // Line Spacing
let textFontAttributes = [
NSFontAttributeName: textFont,
NSForegroundColorAttributeName: textColor,
NSParagraphStyleAttributeName: paragraphStyle
] as [String : Any]
줄 간격 및 줄 높이를 스토리 보드에서 프로그래밍 방식으로 설정 / 업데이트 할 수 있습니다.
Interface Builder에서 :
프로그래밍 방식 :
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
// Swift 4.2++
attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
// Swift 4.1--
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
// Swift 4.2++
// Line spacing attribute
attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: NSRange(location: 0, length: stringValue.characters.count))
// Character spacing attribute
attrString.addAttribute(NSAttributedString.Key.kern, value: 2, range: NSMakeRange(0, attrString.length))
// Swift 4.1--
// 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
나는 이것을 연장했습니다. 아래를보십시오. 확장 기능을 사용하면 다음과 같이 줄 높이를 설정할 수 있습니다.
let label = UILabel()
label.lineHeight = 19
이것은 확장입니다.
// Put this in a file called UILabel+Lineheight.swift, or whatever else you want to call it
import UIKit
extension UILabel {
var lineHeight: CGFloat {
set {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.minimumLineHeight = newValue
paragraphStyle.maximumLineHeight = newValue
_setAttribute(key: NSAttributedString.Key.paragraphStyle, value: paragraphStyle)
}
get {
let paragraphStyle = _getAttribute(key: NSAttributedString.Key.paragraphStyle) as? NSParagraphStyle
return paragraphStyle?.minimumLineHeight ?? 0
}
}
func _getAttribute(key: NSAttributedString.Key) -> Any? {
return attributedText?.attribute(key, at: 0, effectiveRange: .none)
}
func _setAttribute(key: NSAttributedString.Key, value: Any) {
let attributedString: NSMutableAttributedString!
if let currentAttrString = attributedText {
attributedString = NSMutableAttributedString(attributedString: currentAttrString)
} else {
attributedString = NSMutableAttributedString(string: text ?? "")
text = nil
}
attributedString.addAttribute(key,
value: value,
range: NSRange(location: 0, length: attributedString.length))
attributedText = attributedString
}
}
메모:
- 나는 줄 높이 배수를 좋아하지 않습니다. 내 디자인 문서에는 배수가 아닌 20과 같은 높이가 있습니다.
- 다른 답변과 마찬가지로 lineSpacing은 완전히 다릅니다. 당신이 원하는 것이 아닙니다.
- 추가 _set / _getAttribute 메서드가있는 이유는 문자 간격을 설정하는 데 동일한 방법을 사용하기 때문입니다. 다른 NSAttributedString 값에도 사용할 수 있지만 문자 간격 (Swift / UIKit의 커닝)과 줄 높이 만 잘하는 것 같습니다.
There are two properties of NSParagraphStyle
that modify the height between successive text baselines in the same paragraph: lineSpacing
and lineHeightMultiple
. @Schoob is right that a lineHeightMultiple
above 1.0
adds additional space above the text, while a lineSpacing
above 0.0
adds space below the text. This diagram shows how the various dimensions are related.
To get the text to stay centred the aim is therefore to specify one in terms of the other, in such a way that any 'padding' we add by one attribute (top/bottom) is balanced by determining the other attribute's padding (bottom/top) to match. In other words, any extra space added is distributed evenly while otherwise preserving the text's existing positioning.
The nice thing is that this way you can choose which attribute you want to specify and then just determine the other:
extension UIFont
{
func lineSpacingToMatch(lineHeightMultiple: CGFloat) -> CGFloat {
return self.lineHeight * (lineHeightMultiple - 1)
}
func lineHeightMultipleToMatch(lineSpacing: CGFloat) -> CGFloat {
return 1 + lineSpacing / self.lineHeight
}
}
From here, other answers show how these two attributes can be set in an NSAttributedString
, but this should answer how the two can be related to 'centre' the text.
This worked for me in Xcode 7.2. iOS 9.2.1. (Swift 2.1.):
dispatch_async(dispatch_get_main_queue()) { () -> Void in
let paragraphStyleWithSpacing = NSMutableParagraphStyle()
paragraphStyleWithSpacing.lineSpacing = 2.0 //CGFloat
let textWithLineSpacing = NSAttributedString(string: str, attributes: [NSParagraphStyleAttributeName : paragraphStyleWithSpacing])
self.MY_TEXT_VIEW_NAME.attributedText = textWithLineSpacing
}
Another way of twerking with a NSAttributedString line position is playing with baselineOffset attribute:
let contentText = NSMutableAttributedString(
string: "I see\nI'd think it`d be both a notification and a\nplace to see past announcements\nLike a one way chat.")
contentText.addAttribute(.baselineOffset, value: 10, range: NSRange(location: 0, length: 5))
contentText.addAttribute(.baselineOffset, value: -10, range: NSRange(location: 85, length: 20))
Result:
"I see
I'd think it`d be both a notification and a
place to see past announcements
Like a one way chat."
https://stackoverflow.com/a/55876401/4683601
이 모든 답변을 시도했지만 Sketch 또는 Zeplin의 디자인 파일에서 일반적으로 제공 되는 정확한 선 높이 를 얻으려면 다음을 수행해야합니다.
let ps = NSMutableParagraphStyle()
ps.minimumLineHeight = 34
ps.maximumLineHeight = 34
let attrText = NSAttributedString(
string: "Your long multiline text that will have exact line height spacing",
attributes: [
.paragraphStyle: ps
]
)
someLabel.attributedText = attrText
someLabel.numberOfLines = 2
...
참조 URL : https://stackoverflow.com/questions/8138859/core-text-nsattributedstring-line-height-done-right
'IT Share you' 카테고리의 다른 글
"compilerVersion"IIS 오류를 어떻게 수정합니까? (0) | 2021.01.10 |
---|---|
사용자가 앱 내에서 최신 앱 버전을 확인하도록 허용하는 방법은 무엇입니까? (0) | 2021.01.10 |
CSS를 통해 'semi-bold'글꼴을 설정하려면 어떻게해야합니까? (0) | 2021.01.10 |
C ++에서 조합 생성 (0) | 2021.01.10 |
US-ASCII에서 UTF-8 (iconv)로 강제 인코딩 (0) | 2021.01.10 |