iOSのアプリを開発していて、iOSデバイスで使えるフォントを調べたいことは、よくあると思います。ネット検索すれば、そういう情報は見つかると思いますが、サクッとiOSシミュレータや実機で、直接フォント一覧を取得したほうが、かんたんでしょう。いちど、フォント一覧をするアプリ(プロジェクト)を作っておけば、あとは手間いらずです。
下にコードを載せますが、いたってかんたんで短いコードで完成します。(Xcode 8.0で作成)
先頭ページで、フォントファミリーの一覧が表示され、ファミリー内に2個以上フォントがあるファミリーは、タップすると、次ページにファミリー内のフォントが表示されます。
(1) まず、Xcodeを起動して、Single View Applicationを新規作成します。
(2) Storyboard上のViewControllerを選択して、Editor
メニューEmbed in
>Navigation Controller
で、Navigation Controllerを追加します。
(3) ViewControllerに、UITableViewを貼り付けます。Table Viewを、ViewController.swift
上のIBOutlettableView
にConnectします。
Table ViewのdataSource
とdelegate
を、ViewController
とします。そして、UITableViewCellのプロトタイプに、Cell
というIdentifierをつけます。
(4) ViewControllerのStoryboard IDをMain Controller
とします。
(5) ViewController.swift
を以下のように編集します。
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
// フォントファミリー名。nilだと、先頭ページであることを示す。
var familyName: String? = nil
// 先頭ページでは、フォントファミリー名の配列。フォントファミリーのページでは、フォント名の配列。
private var nameArray = [String]()
override func viewDidLoad() {
super.viewDidLoad()
// プロパティfamilyNameがnilだったら、nameArrayにフォントファミリー名の配列、そうでなかったら、ファミリーのフォントの配列を代入。
if let familyName = familyName {
nameArray = UIFont.fontNames(forFamilyName: familyName)
// Navigation Barのタイトルをファミリー名にする。
title = familyName
} else {
nameArray = UIFont.familyNames
title = "Font families"
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Table ViewのDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return nameArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let fontName = nameArray[indexPath.row]
// ファミリー名、あるいはフォント名。
cell.textLabel?.text = fontName
// ファミリー内に2個以上のフォントがある場合、セルのアクセサリーをdisclosureにして、タップすると、次ページに遷移することを印象付ける。
cell.textLabel?.font = UIFont(name: fontName, size: 17.0)
if familyName == nil && UIFont.fontNames(forFamilyName: fontName).count > 1 {
cell.accessoryType = .disclosureIndicator
} else {
cell.accessoryType = .none
}
return cell
}
// Table ViewのDelegate
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 先頭ページで、フォントが2個以上あるファミリーをタップした時だけ、ページを遷移する。
guard let cell = tableView.cellForRow(at: indexPath),
cell.accessoryType == .disclosureIndicator,
familyName == nil else {
return
}
// 遷移は、プログラム(pushViewController〜)で行う。
if let viewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Main Controller") as? ViewController {
viewController.familyName = nameArray[indexPath.row]
if let navigator = navigationController {
navigator.pushViewController(viewController, animated: true)
}
}
}
}