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>
총결산
부인에게 말했다. "다 했어!"나는 자랑스럽게 "아, 네."라고 말했다.iOS에서도 전단지를 디자인할 수 있습니다!대단해?!대단하죠?!https://t.co/7VlaDJlVyc
- 고양이 전신 검정(@macneko ayu)2018년 9월 7일
参考
Reference
이 문제에 관하여(iOS로 전단식의 가격 레이아웃을 재현하였다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/macneko/items/81e249f9b6046e6254e2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)