사용자 정의 설치 글꼴이 UILabel에 올바르게 표시되지 않음


83

Adobe Font Collection Pro Package에서 가져온 Helvetica Neue Condensed 글꼴 을 사용하려고합니다 . 불행히도 내에서 사용할 때 잘못 그리는 것 같습니다 UILabel.

선 높이가 올바르게 계산 된 것 같지만 (제 생각에는) 글꼴이 표시되면 경계 상자의 맨 위에 정렬됩니다. [myLabel sizeToFit]이 화면 캡처를 생성하기 위해 호출 하고 너비 만 조정했습니다.

잘못된 글꼴 렌더링의 화면 캡처

나는 굵은 글꼴과 일반 버전의 글꼴 모두에서 동일한 문제가 발생했습니다. OSX에서 Helvetica Neue Bold 버전을 가져와 내 장치에 넣을 수 있었고 잘 표시됩니다 (위 그림의 녹색 배경).

이런 식으로 그리는 글꼴 파일이나 내 코드에 어떤 문제가 있습니까?


어떻게 든 이러한 문제를 해결할 수있는 UIFont의 하위 클래스를 만들 수 있습니까?
MikeQ 2011 년

+1-나에게도 같은 문제입니다. 나는 이것을 돕기 위해 ZFont를 사용해 보았지만 어느 정도 도움이되지만 거의 충분하지는 않습니다. 이러한 사용자 정의 글꼴로 행간을 해석하는 방법에 대해 잘못된 것일 수 있습니다 (실제로 단서가 없습니다.하지만 그게 그것과 관련이있을 수 있다고 생각해야합니다!).
조 D' 안드레아

안녕! 결국 해결책을 찾았습니까? 그렇다면 질문에 답하십시오. 미리 감사드립니다.
Soonts

안타깝게도 아니에요. 그리고 나는이 문제를 일으킨 원본 글꼴 파일에 더 이상 액세스 할 수 없습니다. 나는 kolyuchiy의 대답을 좋아한다. 나는 나의 특정한 경우에만 그것을 시험 할 수 있기를 바란다.
MikeQ

아시다시피 이것은 iOS7에서 수정되었습니다.
친구

답변:


125

여기에 ttf 글꼴 파일 패치와 관련된 솔루션을 게시했습니다 .

다음은 UILabel, UIButton 등에서 동일한 문제가 발생한 사용자 지정 글꼴에 대해 작동했던 솔루션입니다. 글꼴의 문제는 ascender 속성이 시스템 글꼴의 값에 비해 너무 작다는 사실로 밝혀졌습니다. Ascender는 글꼴 문자 위의 세로 공백입니다. 글꼴을 수정하려면 Apple Font Tool Suite 명령 줄 유틸리티 를 다운로드해야합니다 . 그런 다음 글꼴을 가져 와서 다음을 수행하십시오.

~$ ftxdumperfuser -t hhea -A d Bold.ttf

이렇게하면 Bold.hhea.xml. 텍스트 편집기로 열고 ascender속성 값을 늘리십시오 . 자신에게 가장 적합한 정확한 값을 찾으려면 약간의 실험을해야합니다. 제 경우에는 750에서 1200으로 변경했습니다. 그런 다음 다음 명령 줄을 사용하여 유틸리티를 다시 실행하여 변경 사항을 ttf 파일에 다시 병합합니다.

~$ ftxdumperfuser -t hhea -A f Bold.ttf

그런 다음 앱에서 결과 ttf 글꼴을 사용하십시오.


이 도구를 제안 해 주셔서 감사합니다! 마찬가지로 "-t name"섹션을 편집하여 글꼴 이름을 바꾸는 데 사용할 수도 있습니다.
Philippe

1
Mensis 또는 FontForge를 사용해 볼 수도 있습니다 . 이러한 앱은 ascender 속성을 변경하는데도 사용할 수 있습니다.
kolyuchiy

1
당신은 내 하루를 만들었습니다. 나는 몇 주 동안이 문제에 시달렸다. 꽤 자주 사용할 수 있습니다!
TheBeardedCoda 2012-06-26

1
어 센더를 늘리면 줄 간격이 늘어납니다. 앱에 여러 줄 텍스트가있는 경우 문제가 될 수 있습니다.
Pavel Alexeev 2013

2
** 아래의 JOSEPH LIN의 답변도 참조하세요. ** iOS 6과 iOS 7 모두에서 잘 정렬되도록하려면 ascender를 조정하고 linegap을 0으로 설정해야합니다!
Ken M. Haggerty 2013

64

그래서 이것은 kolyuchiy의 대답 수정 된 버전입니다 .

Glyphs로 글꼴을 열었습니다. 다음 아무것도 수정하지 않고 내보냈습니다. 어떻게 든 마술처럼 수직 정렬 문제가 사라졌습니다!

더 좋은 점은 새 글꼴이와 같은 메서드와 잘 어울리기 sizeWithFont:때문에 Joshua가 언급 한 문제가 없다는 것 입니다.

나는 kolyuchiy 언급 한 명령으로 HHEA 테이블을 확인해 보니 문양 그냥하지 수정 된 것으로 나타났습니다 ascender뿐만 아니라, lineGap그리고 numberOfHMetrics나를 위해.

이전의 원시 데이터는 다음과 같습니다.

versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"

이후 :

versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"

따라서 이야기의 교훈은 상승세를 높이는 것이 아니라 다른 관련 가치도 수정합니다.

저는 타이포그래피 전문가가 아니기 때문에 그 이유와 방법을 설명 할 수 없습니다. 누구든지 더 나은 설명을 제공 할 수 있다면 대단히 감사하겠습니다! :)


나는 이전에 그 기준이 아이폰 OS 6에 잘못 정렬 될 아이폰 OS 6 및 iOS 7에서 동일한 거의 글리프, 글꼴 동작합니다을 사용하여 다시 사용하고있어 TTF를 저장 한 후
leolobato

6
마침내 이것을 알아 내 주셔서 감사합니다! 분명히 iOS 6은 lineGap 속성을 존중하지만 iOS 7은이를 무시합니다. 해결책은 lineGap을 0으로 만들고 그에 따라 어 센더를 더 크게 만드는 것입니다. 이 문양이 한 정확히 무엇이며, 그것은 모두 아이폰 OS 6 및 iOS 7에서 작동
phatmann

예. lineGap을 0으로 줄이고 어 센더를 떠나 (1991 년) Fedora의 무료 "Overpass"글꼴로 문제를 해결했습니다. 솔루션에 대한 안내에 감사드립니다. iOS6 및 iOS7 모두에서 작동합니다.
stephenhouser 2014

나는 Glyphs와 OS X Font Tools로 여러 번 실패한 후 @phatmann과 같은 결론에 도달했습니다. 문제는 단순히 Glyph로 내보내는 대신 OS X 글꼴 도구와 함께이 트릭을 사용하는 것이 더 낫다는 것입니다. 글리프는 글꼴의 스타일 이름과 포스트 스크립트 이름도 편집하여 xCode가 일부 상황에서 글꼴을 찾지 못하도록하기 때문입니다.
huong 2014 년

32

iOS 6은 글꼴의 lineGap 속성을 따르지만 iOS 7은이를 무시합니다. 따라서 줄 간격이 0 인 사용자 지정 글꼴 만 두 운영 체제에서 올바르게 작동합니다.

해결책은 lineGap을 0으로 만들고 그에 따라 어 센더를 더 크게 만드는 것입니다. 위 의 답변에 따라 한 가지 해결책은 Glyph에서 가져오고 내보내는 것입니다. 그러나 향후 버전의 앱에서는이 '버그'를 수정할 수 있습니다.

보다 강력한 솔루션은이 게시물에 따라 글꼴을 직접 편집하는 것 입니다. 구체적으로 특별히,

  1. OS X 글꼴 도구를 설치합니다.
  2. 글꼴 메트릭을 파일로 덤프합니다. ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  3. 편집기에서 덤프 된 파일을 엽니 다.
  4. ascender속성 값을 추가 하여 속성을 편집합니다 lineGap. 예를 들어, lineGap가 200이고 ascender750이면ascender 950을 .
  5. 설정 lineGap0으로 .
  6. 변경 사항을 글꼴에 병합합니다. ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

이렇게하면 그에 따라 UI를 조정해야 할 수 있습니다.


4

사용자 지정 글꼴 중 하나에서 동일한 문제가 발생했습니다. 또한 font ascender 속성을 편집하여 문제를 "수정"했습니다. 그러나 이것이 다른 문제와 레이아웃 문제를 일으킨다는 것을 발견했습니다. 예를 들어 ascender 편집 글꼴을 사용할 때 레이블 높이에 따라 셀 높이를 동적으로 설정하면 폭발 할 수 있습니다.

결국 우리는 UIButton contentEdgetInsets 속성을 변경했습니다.

yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);

어떤 방법이 더 나은지 확실하지 않지만 문제를 해결하는 다른 방법을 공유하고 싶었습니다.


2
동의했습니다. Ascender 속성 수정은 이상적인 솔루션이 아닙니다
Max MacLeod

1
안녕하세요 Joshua, 방금 언급 한 문제를 해결할 수있는 방법을 게시했습니다. 요컨대, 어 센더와 함께 몇 가지 추가 속성을 수정해야합니다.
Joseph Lin

4
  1. 여기에서 Apple의 글꼴 도구 다운로드 및 설치 : https://developer.apple.com/downloads/index.action?q=font (다운로드 링크는 하단에 있음)
  2. 터미널을 열고 글꼴이있는 곳으로 cd
  3. 다음 명령을 실행하십시오. ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  4. 이제 글꼴 속성 중 일부가 포함 된 xml 파일이 있습니다. 텍스트 편집기에서 편집합니다.
  5. "lineGap"속성을 검색하고 값에 200을 더합니다.
  6. xml 파일 저장
  7. 다음 명령을 실행하십시오. ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  8. xml 파일 삭제
  9. iOS 6에서 구성된 글꼴을 사용 해보고 더 좋아 보이는지 확인하십시오.
  10. 필요한 경우 3 단계로 돌아가 "lineGap"속성에 더하거나 뺄 수 있습니다. (내 구성에 250을 추가했습니다)

4

OS X El Capitan을 실행하고이 스레드에 오는 사람들의 경우 Apple Font Tool Suite가 더 이상 호환되지 않는다는 것을 알 수 있습니다 (적어도 지금은).

그러나 무료 글꼴 편집 소프트웨어 인 FontForge를 사용 하여 kolyuchiyJoseph Lin 이 설명한 변경 사항을 수행 할 수 있습니다. .

FontForge로 글꼴을 열고 상단 메뉴에서 요소를 선택한 다음 글꼴 정보> OS / 2> 메트릭으로 이동합니다. HHEad Line Gap 및 HHead Ascent Offset 값을 편집하려고합니다.

필요한 편집을 마치면 파일> 글꼴 생성에서 글꼴을 내보내고 올바른 글꼴 형식을 선택할 수 있습니다.


3

답변 덕분에 Glyphs로 문제를 해결했지만 약간 다릅니다.

Glyphs로 내 글꼴을 열었고 (Glyphs mini에서도 작동 함)이 섹션을 찾았습니다 (Glyphs mini에서 가져 오려면 오른쪽 상단 모서리에있는 i 버튼을 누름) :

여기에 이미지 설명 입력

이 정렬 영역 (또는 일부)을 모두 삭제하면이 문제가 해결됩니다. 나를 위해 완벽하게 작동했습니다.


2

라벨 텍스트에서 속성 텍스트를 만드는 것이 저에게 수정되었습니다. 확장은 다음과 같습니다.

extension UILabel {
    /// You can call with or without param values; without will use default 2.0
    func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.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)
        }
        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        self.attributedText = attributedString
    }
}

내 사용자 정의 글꼴의 경우 필요한 결과를 얻었습니다.

self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)

이것은 NSMutableParagraphStyle()줄 높이 및 간격 속성을 포함 하는 기본 제공 을 사용하여 작동 합니다 ( @IBOutlet라벨을 프로그래밍하지 않는 경우에도 스토리 보드의 속성으로 액세스 할 수 있음 ).


1

핵심 텍스트 를 사용해 보셨습니까 ? Core Text를 통해 사용자 지정 글꼴을 성공적으로 렌더링했지만 귀하의 상황에 맞는지 모르겠습니다.


1
핵심 텍스트에이 문제가 없음을 확인할 수 있습니다.
2013


0

이러한 명령 줄 유틸리티에 문제가있는 경우 창에서 fontcreator를 사용해보십시오. 설정 메뉴에서 폰트 어 센더를 변경합니다.


0

Mac OS Mojave에서 명령을 찾을 수 없음 오류로 인해 ftxdumperfuser( kolyuchiy 답변) 사용하는 데 어려움을 겪는 사람 :

  • Apple에서 글꼴 도구 패키지를 다운로드하십시오. https://developer.apple.com/download/more/?q=font 에서 찾은 다음 XCode 11 용으로 선택했습니다.
  • dmg 파일 마운트
  • 디스크 이미지 입력 ​​cd / Volumes / macOS \ Font \ Tools
  • 선택한 폴더에 패키지 압축을 풉니 다. pkgutil --expand-full macOS \ Font \ Tools.pkg ~ / font-tools
  • CLI 도구는 이제 ~ / font-tools / FontCommandLineTools.pkg / Payload에서 사용할 수 있습니다. 폴더를 경로 ( export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload")에 추가하거나 유틸리티를 bin 폴더에 복사 할 수 있습니다.

-3

Sprite Kit 게임에서 상징적 인 "FontAwesome"글꼴과 비슷한 문제가있었습니다. SKLabelNode의 SKLabelVerticalAlignmentMode 속성을 .Center로 설정하면 저에게 효과적이었습니다.

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

누군가가 같은 문제로 어려움을 겪을 경우를 대비하여 공유하고 싶었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.