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
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
3k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
darquro
2
5.6k
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
900
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
120
Other Decks in Programming
See All in Programming
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
310
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
0
180
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
280
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
450
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
280
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
150
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
17k
yield再入門 #phpcon
o0h
PRO
0
840
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
290
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
9
3.8k
Featured
See All Featured
Building an army of robots
kneath
306
46k
Designing Experiences People Love
moore
143
24k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
880
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
430
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Tell your own story through comics
letsgokoyo
1
1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
980
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
GraphQLとの向き合い方2022年版
quramy
50
15k
Speed Design
sergeychernyshev
33
2k
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