14
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Swift3] iOSデバイスのフォント一覧アプリを作る。

Posted at

iOSのアプリを開発していて、iOSデバイスで使えるフォントを調べたいことは、よくあると思います。ネット検索すれば、そういう情報は見つかると思いますが、サクッとiOSシミュレータや実機で、直接フォント一覧を取得したほうが、かんたんでしょう。いちど、フォント一覧をするアプリ(プロジェクト)を作っておけば、あとは手間いらずです。
下にコードを載せますが、いたってかんたんで短いコードで完成します。(Xcode 8.0で作成)
先頭ページで、フォントファミリーの一覧が表示され、ファミリー内に2個以上フォントがあるファミリーは、タップすると、次ページにファミリー内のフォントが表示されます。

fontlist.png

(1) まず、Xcodeを起動して、Single View Applicationを新規作成します。
(2) Storyboard上のViewControllerを選択して、EditorメニューEmbed inNavigation Controllerで、Navigation Controllerを追加します。
(3) ViewControllerに、UITableViewを貼り付けます。Table Viewを、ViewController.swift上のIBOutlettableViewにConnectします。
Table ViewのdataSourcedelegateを、ViewControllerとします。そして、UITableViewCellのプロトタイプに、CellというIdentifierをつけます。
(4) ViewControllerのStoryboard IDMain Controllerとします。
(5) ViewController.swiftを以下のように編集します。

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)
            }
        }
    }

}
14
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?