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
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
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
120
React本体のコードリーディング
high_g_engineer
1
140
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
220
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
180
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
500
メールのエイリアス機能を履き違えない
isshinfunada
0
240
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Navigating Team Friction
lara
192
16k
The agentic SEO stack - context over prompts
schlessera
0
860
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Unsuck your backbone
ammeep
672
58k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Into the Great Unknown - MozCon
thekraken
41
2.7k
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