2016-07-01 4 views
0

샘플 프로젝트 : 나는 기본적으로 UILabel의 아주 기본적인 레크리에이션 무엇인지에 텍스트를 렌더링 TextKit을 사용하고 http://d.pr/f/1coXu텍스트를 렌더링 할 때 TextKit을 사용하면 두 번째 줄이 첫 번째 줄보다 짧아 집니 까?

. 코드는 매우 간단하며이 예에서는 단지 뷰 자체에 하드 NSAttributedString을 그립니다 그러나

class TextKitView: UIView { 
    // TextKit Objects 
    var textStorage: NSTextStorage! 
    var textContainer: NSTextContainer! 
    var layoutManager: NSLayoutManager! 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     backgroundColor = UIColor.clearColor() 

     layoutManager = NSLayoutManager() 

     textStorage = NSTextStorage(attributedString: createAttributedString()) 
     textStorage.addLayoutManager(layoutManager) 

     textContainer = NSTextContainer(size: CGSize(width: bounds.width, height: bounds.height)) 
     layoutManager.addTextContainer(textContainer) 
    } 

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } 

    override func drawRect(rect: CGRect) { 
     let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer) 
     layoutManager.drawBackgroundForGlyphRange(glyphRange, atPoint: bounds.origin) 
     layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: bounds.origin) 
    } 

    private func createAttributedString() -> NSAttributedString { 
     let attributedString = NSMutableAttributedString(string: "Test string for testing", attributes: [NSForegroundColorAttributeName: UIColor.blackColor(), NSFontAttributeName: UIFont.systemFontOfSize(16.0)]) 

     let labelAttributedString = NSAttributedString(string: "Foo bar\n testing", attributes: [NSForegroundColorAttributeName: UIColor.darkGrayColor(), NSBackgroundColorAttributeName: UIColor(white: 0.95, alpha: 1.0)]) 
     attributedString.appendAttributedString(labelAttributedString) 

     return attributedString 
    } 
} 

, 내가보기 만들 때 :

override func viewDidLoad() { 
    super.viewDidLoad() 

    let textKitView = TextKitView(frame: CGRect(x: 0.0, y: 100.0, width: 320.0, height: 320.0)) 
    view.addSubview(textKitView) 
} 

을 그것은이처럼 보이는 끝 :

enter image description here

설명 할 수없는 이유로 볼 수있는 두 번째 줄의 배경색과 높이가 상당히 짧습니다. 처음보다, 정말 이상하게 보입니다.

어떻게 방지합니까? 이 문제의 원인은 무엇입니까? UILabel을 사용하고 동일한 속성 문자열을 제공하면 두 줄의 높이가 모두 동일합니다. 도움이된다면 위에 최소한의 샘플 프로젝트를 첨부했습니다.

+0

질문을 이해하지 못합니다. "Foo bar testing"은 모두 같은 크기입니다. 첫 번째 줄의 배경색 높이는 줄에 더 큰 텍스트가 포함되어 있기 때문에 높이가 더 큽니다. 이를 증명하기 위해 "테스트 용 테스트 문자열"부분을 제거하십시오. 또는 첫 번째 줄 배경색의 맨 아래가 "테스트 용 테스트 문자열"의 "g"디 센더와 어떻게 완벽하게 일치하는지 확인할 수 있습니다. – matt

+0

@matt 좋아요, 다른 말로 표현하면 줄의 내용에 관계없이 높이를 어떻게 일관되게 할 수 있습니까? –

+0

상대적으로 높은 수준의 코드 (TextKit 대 대)를 사용하면 모든 줄에 필요한 큰 글꼴 크기의 공백이 포함되도록 할 수 있습니다 – Feldur

답변

1

체크 아웃 NSParagraphStyle : 클래스에 https://developer.apple.com/reference/uikit/nsparagraphstyle

있습니다 줄 높이 속성, 즉 minimumLineHeightmaximumLineHeight 당신이 뭘 하려는지 달성 할 수있다. 다음과 같이 NSAttributedString의 단락 스타일을 설정할 수 있습니다.

let paraStyle = NSMutableParagraphStyle() 
paraStyle.setParagraphStyle = NSParagraphStyle.default 
paraStyle.minimumLineHeight = 50 // for example 
attributedString.addAttribute(NSParagraphStyleName, value: paraStyle, range:NSMakeRange(0, attributedString.length))