mattermost-mobile/ios/MattermostShare/Views/FontIconViews/FontLoader.swift
Elias Nahum 3a3123674a
[Gekidou] iOS Share extension (#6432)
* iOS Share extension

* Add Fastlane steps for iOS Share Extension

* new multi file layout

* Add recent label

* Refactor code & identation

* ux feedback

* downsample images

* remove options horizontal padding
2022-07-27 10:31:45 -04:00

95 lines
2.3 KiB
Swift

//
// SwiftUIFontIcon.swift
// MattermostShare
//
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
//
#if canImport(UIKit)
import UIKit
#else
import AppKit
#endif
import Foundation
public enum FontCode {
case compassIcons(code: CompassIconsCode)
var fontFamilyName: String {
switch self {
case .compassIcons:
return "compass-icons"
}
}
var fileName: String {
switch self {
case .compassIcons:
return "compass-icons"
}
}
var code: String {
switch self {
case .compassIcons(code: let code):
return code.rawValue
}
}
}
public extension FontCode {
func systemFont(size: CGFloat) -> UIFont {
if (UIFont.fontNames(forFamilyName: self.fontFamilyName).count == 0) {
FontLoader.loadFont(self)
}
return UIFont(name: self.fileName, size: size)!
}
}
class FontLoader: NSObject {
class func loadFont(_ fontCode: FontCode) {
let fontName = fontCode.fileName
let paths = self.getFontPaths()
var fontURL = URL(string: "")
var error: Unmanaged<CFError>?
paths.forEach {
guard let filename = NSURL(fileURLWithPath: $0).lastPathComponent,
filename.lowercased().range(of: fontName.lowercased()) != nil else {
return
}
fontURL = NSURL(fileURLWithPath: $0) as URL
}
guard let unwrappedFontURL = fontURL,
let data = try? Data(contentsOf: unwrappedFontURL),
let provider = CGDataProvider(data: data as CFData) else {
return
}
let font = CGFont.init(provider)
guard let unwappedFont = font,
!CTFontManagerRegisterGraphicsFont(unwappedFont, &error),
let unwrappedError = error,
let nsError = (unwrappedError.takeUnretainedValue() as AnyObject) as? NSError else {
return
}
let errorDescription: CFString = CFErrorCopyDescription(unwrappedError.takeUnretainedValue())
NSException(name: NSExceptionName.internalInconsistencyException,
reason: errorDescription as String,
userInfo: [NSUnderlyingErrorKey: nsError]).raise()
}
}
extension FontLoader {
static func getFontPaths() -> [String] {
let bundle = Bundle(for: FontLoader.self)
return bundle.paths(forResourcesOfType: "ttf", inDirectory: nil)
}
}