iOS로 전단식의 가격 레이아웃을 재현하였다

개요


트위터에서는 UIStackView에서 팬들이 도전하는 모습을 목격했다.
굳이 같은 StackView로 도전하면 ¥ 나온다...https://t.co/0rPgMqLocr-있잖아(@a aryzae)2018년 9월 7일

트레이스 게시물, NSAttributed String에 설치할 수 있다는 말에 관심이 생겨서 도전해봤어요


만든 물건


문자의 크기감은 눈과 거리가 멀다.



//
//  ViewController.swift
//  Price
//
//  Created by macneko on 2018/09/07.
//  Copyright © 2018年 macneko. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()
        self.view.addSubview(label)

        label.frame = self.view.frame
        label.textAlignment = .center

        let fontSize: CGFloat = 80
        let font = UIFont.systemFont(ofSize: fontSize)
        let attributeText = NSMutableAttributedString(string: "各種¥(税込)280",
                                                      attributes: [.font: font, .foregroundColor: UIColor.red])
        // 各種
        attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.4),
                                     .baselineOffset: 2],
                                    range: NSRange(location: 0, length: 2))
        // ¥
        attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.6),
                                     .kern: -50],
                                    range: NSRange(location: 2, length: 1))
        // (税込)
        attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.2),
                                     .baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 4],
                                    range: NSRange(location: 3, length: 4))
        // ()のベースライン調整
        attributeText.addAttributes([.baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 3],
                                    range: NSRange(location: 3, length: 1))
        attributeText.addAttributes([.baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 3],
                                    range: NSRange(location: 6, length: 1))
        label.attributedText = attributeText
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

설명


부분 소스 코드를 잘라서 처리 내용을 설명합니다


let fontSize: CGFloat = 80
let font = UIFont.systemFont(ofSize: fontSize)
let attributeText = NSMutableAttributedString(string: "各種¥(税込)280",
                                              attributes: [.font: font, .foregroundColor: UIColor.red])

우선 attributeText에 기본 장식과 문자열을 미리 저장하고 NSRange로 장식을 변경하고 싶은 부분을 지정하여 가공하는 방법p>

// 各種
attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.4),
                             .baselineOffset: 2],
                            range: NSRange(location: 0, length: 2))

여러 부분입니다.

문자 크기 기본 크기의 40% 지정br/> 기준선이 숫자보다 약간 아래로 이동하는 것처럼 보이기 때문에 지정.baselineOffset: 2은 약간 위로 이동한다br/>
베이스라인 정보, P14 그림 참조라틴 자모와 영문 조판br/>
간단하게 말하면 .baselineOffset정수를 줄 때 위로 이동하고 마이너스를 줄 때 아래로 이동한다p>

// ¥
attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.6),
                             .kern: -50],
                            range: NSRange(location: 2, length: 1))

¥의 부분입니다.

문자 크기 기본 크기의 60% 지정br/>
다음 문자의 (그와 사이의 간격을 지정합니다.

간단하게 말하면 .kern: -50(자모의 간격이 같다)는 문자와 다음 문자 사이에 설정된 소추이다.br/>
또한, 주차장에는 해당되지 않는 것 같아서 ¥ 전에 차량 간격을 동일하게 설정했다p>

// (税込)
attributeText.addAttributes([.font: UIFont.systemFont(ofSize: fontSize * 0.2),
                             .baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 4],
                            range: NSRange(location: 3, length: 4))

(세금 포함) 부분br/>
문자 크기 기본 크기의 20%를 지정합니다.br/>
기준선은 상대값으로 계산되지만 이것만으로는 정렬이 잘 되지 않아 미세하게 조정되었습니다.


// ()のベースライン調整
attributeText.addAttributes([.baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 3],
                            range: NSRange(location: 3, length: 1))
attributeText.addAttributes([.baselineOffset: (fontSize * 0.8) - (fontSize * 0.2) - 3],
                            range: NSRange(location: 6, length: 1))

부분.br/>
기선이 정렬되지 않았기 때문에 이 부분만 미세하게 조정했습니다.


문자열마다 NSAttributed StringKey를 지정하는데 마지막에 결합하는 방법도 괜찮은데 DTP의 기법이 비교적 숙련되어 이 방법을 사용했기 때문에 Iuslltrator와 InDesign을 특별히 만지는 느낌이 든다.p>

총결산




参考


Mastering TextKit


좋은 웹페이지 즐겨찾기