Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS View Class Design Basic
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
darquro
May 10, 2019
Programming
860
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
iOS View Class Design Basic
Swift愛好会 vol.40
darquro
May 10, 2019
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
1.1k
Jailbreakと向き合おう
darquro
0
3.1k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
darquro
2
5.7k
Half modal comparision in iOS15
darquro
2
3k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
160
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.8k
Swift 5 Exclusivity Enforcement
darquro
4
910
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
120
Other Decks in Programming
See All in Programming
Oxlintはいいぞ(続)
yug1224
1
510
不幸な GC
chencmd
0
850
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
370
Dockerfile CMD for Node.js
grazie1999
0
160
Press start. Python's next generation.
willingc
PRO
3
300
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
600
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
200
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
340
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
730
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
400
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
540
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Bash Introduction
62gerente
615
220k
YesSQL, Process and Tooling at Scale
rocio
174
15k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Unsuck your backbone
ammeep
672
58k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Odyssey Design
rkendrick25
PRO
2
790
Mind Mapping
helmedeiros
PRO
1
340
Embracing the Ebb and Flow
colly
88
5.2k
Utilizing Notion as your number one productivity tool
mfonobong
4
560
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
Transcript
Re:valua t ion https://fril.jp/ L ead & Delight User F
irst Ownership Fail Smart J047JFXΫϥεઃܭجຊ .BZ BU4XJGUѪձWPM
.PCJMF&OHJOFFS 3BLVUFO JOD "CPVU.F EBSRVSP :VLJ,VSPEB !EBSRVSP !EBSRVSP
None
ࠓͷςʔϚΛߟ͑ͨཧ༝
5BCMFPG$POUFOUT w 7JFXͷΫϥεઃܭʹ͓͚Δجຊ w ΧελϜ7JFXΛ࡞Δ্Ͱͷ5JQT
ྫ
࣮ํ๏ " 4UPSZCPBSE 7JFX$POUSPMMFS
࣮ํ๏ " 4UPSZCPBSE 7JFX$POUSPMMFS 'BU7JFX$POUSPMMFS # 4UPSZCPBSE 7JFX$POUSPMMFS
9*# 7JFX
"UPNJD%FTJHO
"UPNJD%FTJHO w 6*σβΠϯʹ͓͚Δߟ͑ํ w ύʔπɺίϯϙʔωϯτΛ ࠷খ୯Ґ ݪࢠʣ͔Βߟ͑Δ IUUQBUPNJDEFTJHOCSBEGSPTUDPN
"UPNJD%FTJHO IUUQBUPNJDEFTJHOCSBEGSPTUDPN ݪࢠ ࢠ ༗ػ ςϯϓϨʔτ ϖʔδ
"UPNJD%FTJHO 8BOUFEMZ5FDI#PPL ୈষJ04Ͱ࣮͢Δ"UPNJD%FTJHO IUUQTXXXXBOUFEMZDPNDPNQBOJFTXBOUFEMZQPTU@BSUJDMFT
"UPNJD%FTJHO
"UPNJD%FTJHO "UPNT ʢݪࢠʣ .PMFDVMFT ʢࢠʣ 0SHBOJTNT ʢ༗ػʣ ૹྉࠐΈ
"UPNJD%FTJHO 1BHFT ʢϖʔδʣ 5FNQMBUFT ʢςϯϓϨʔτʣ YYYY YYYY YYYY
YYYY YYYY YYYY YYYY YYYY = YYY YYYYYYYYYYYYYYY YYY YYY YYYYYYYYYYYYYYY
.PMFDVMFTʢࢠʣ .PMFDVMFTʢࢠʣ w 6**NBHF7JFX ݪࢠ ͱ 6*-BCFM ݪࢠ
͕ਫฏʹฒͼɺ ؙ֯ͷઢ ݪࢠ Λ࣋ͭ7JFX 3PVOEFE$PSOFS8JUI*DPO-BCFM
0SHBOJTNTʢ༗ػʣ 0SHBOJTNTʢ༗ػʣ w ෳͷ 3PVOEFE$PSOFS8JUI*DPO-BC FM ࢠ Λ
ஔ͢Δ͜ͱ͕Ͱ͖Δ7JFX
5FNQMBUFTʢςϯϓϨʔτʣ 5FNQMBUFTʢςϯϓϨʔτʣ w Ͳ͜ΛมߋՄೳͱͳΔͷ͔ w ΞΠίϯදࣔඇදࣔɺ৭ w ςΩετ৭ɺαΠζ
w ઢ༗ແɺଠ͞ɺ৭ w എܠ৭ YYY YYY YYY
͜͜·Ͱͷ·ͱΊ
͜͜·Ͱͷ·ͱΊ w 'BU7JFX$POUSPMMFSΛͳͨ͘ΊʹɺΧελϜ7JFXͰ ίʔυ͠Α͏ w "UPNJD%FTJHOΛࢀߟʹ͠ͳ͕Βɺ7JFXΫϥεઃܭ Λߟ͑Α͏
͜͜·Ͱͷ·ͱΊ w ΞϓϦέʔγϣϯΛ࡞Δ্ͰͷҰൠతͳઃܭཧ w ΞʔΩςΫνϟʔ .7$ .71 .77.
$MFBO "SDIJUFDUVSF 3FEVY FUDʜ w σβΠϯύλʔϯ 'BDUPSZ 1SPUPUZQF 4JOHMFUPO 0CTFSWFS FUDʜ
͜͜·Ͱͷ·ͱΊ w ΞϓϦέʔγϣϯΛ࡞Δ্ͰͷҰൠతͳઃܭཧ w ΞʔΩςΫνϟʔ .7$ .71 .77.
$MFBO "SDIJUFDUVSF 3FEVY FUDʜ w σβΠϯύλʔϯ 'BDUPSZ 1SPUPUZQF 4JOHMFUPO 0CTFSWFS FUDʜ ͷ
ΧελϜ7JFXΛ࡞Δ্Ͱͷ5JQT
ᶃ9*#ͰσβΠϯ͢Δ7JFX
ᶃ9*#ͰσβΠϯ͢Δ7JFX extension NibLoadable where Self: UIView { static
var nibName: String { return String(describing: self) } static func loadNib(_ bundle: Bundle? = nil) -> UINib { let bundle = bundle ?? Bundle.main return UINib(nibName: nibName, bundle: bundle) } func loadSubviewFromNib() { let nib = Self.loadNib(Bundle(for: type(of: self))) guard let subview = nib.instantiate(withOwner: self, options: nil).first as? UIView else { return } subviews.forEach { $0.removeFromSuperview() } addSubview(subview) setNeedsUpdateConstraints() } func fitConstraintsSubview() { if let contentView = subviews.first { contentView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ contentView.topAnchor.constraint(equalTo: self.topAnchor), contentView.leftAnchor.constraint(equalTo: self.leftAnchor), contentView.rightAnchor.constraint(equalTo: self.rightAnchor), contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor) ]) } } }
ᶃ9*#ͰσβΠϯ͢Δ7JFX required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder)
setup() } override init(frame: CGRect) { super.init(frame: frame) setup() } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() setup() } private func setup() { loadSubviewFromNib() } override func updateConstraints() { fitConstraintsContentView() super.updateConstraints() }
ᶄ!*#%FTJHOBCMFɺ!*#*OTQFDUBCMFΛ͏ @IBDesignable final class RoundedCornerWithIconLabel: UIView { @IBInspectable
var cornerRadius: CGFloat = -1 @IBInspectable var borderColor: UIColor = ColorPalette.textGray @IBInspectable var borderWidth: CGFloat = 1 @IBInspectable var text: String = "Label" @IBInspectable var textColor: UIColor = ColorPalette.textGray @IBInspectable var isImageShown: Bool = false @IBInspectable var image: UIImage? @IBInspectable var imageTintColor: UIColor = ColorPalette.textGray
ᶄ!*#%FTJHOBCMFɺ!*#*OTQFDUBCMFΛ͏ @IBInspectable var text: String = "Label" {
didSet { setText(text) } } private func setText(_ value: String) { label.text = value label.sizeToFit() }
ᶅQSFQBSF'PS*OUFSGBDF#VJMEFSΛ͏ required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder)
setup() } override init(frame: CGRect) { super.init(frame: frame) setup() } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() setup() } private func setup() { loadSubviewFromNib() setCornerRadius(cornerRadius) setBorderColor(borderColor) setBorderWidth(borderWidth) setImageShown(isImageShown) setImage(image) setImageTintColor(imageTintColor) setTextColor(textColor) setText(text) setTextFontSize(textFontSize) }
ᶆMB[ZWBS*OJUJBMJ[BUJPO$MPTVSFΛ͏ @IBDesignable final class ItemDetailItemSalesLabelsContainer: UIView { private
lazy var includeCarriageLabel: UIView = { let label = RoundedCornerWithIconLabel(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) label.labelType = ItemDetailItemSalesLabelType.includeCarriage label.backgroundColor = ColorPalette.lightOrange label.borderWidth = 0 label.isImageShown = true label.image = FLFrilIcon.tagIcon(withSize: 14.0) .image(with: CGSize(width: 14.0, height: 14.0)) .withRenderingMode(.alwaysTemplate) label.imageTintColor = ColorPalette.textWhite label.text = "ૹྉࠐΈ" label.textColor = ColorPalette.textWhite label.setContentHuggingPriority(.defaultHigh, for: .horizontal) return label }()
ᶇ0QUJPO4FUΛ͏ struct ItemDetailItemSalesLabelOptionSet: OptionSet { let rawValue: UInt8
static let includeCarriage = ItemDetailItemSalesLabelOptionSet(rawValue: 1 << 0) static let excludeCarriage = ItemDetailItemSalesLabelOptionSet(rawValue: 1 << 1) static let anonymousCarriage = ItemDetailItemSalesLabelOptionSet(rawValue: 1 << 2) static let nowAvailable = ItemDetailItemSalesLabelOptionSet(rawValue: 1 << 3) } @IBDesignable final class ItemDetailItemSalesLabelsContainer: UIView { var labelSet: ItemDetailItemSalesLabelOptionSet = [] }
͍͞͝ʹ ͷΛҙࣝͨ͠ઃܭͰɺݎ࿚ͳιʔείʔυΛ ࢦ͠·͠ΐ͏
5IBOLZPVGPSMJTUFOJOH