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
darquro
May 10, 2019
Programming
850
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
3k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
darquro
2
5.6k
Half modal comparision in iOS15
darquro
2
2.9k
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
890
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
110
Other Decks in Programming
See All in Programming
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
15
7.7k
はてなアカウント基盤 State of the Union
cockscomb
1
970
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.5k
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
610
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
120
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
0
170
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.4k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
220
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
120
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.8k
Featured
See All Featured
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
370
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
320
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
160
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
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