iOSDC 2018 9/1(土)のルーキーズLT枠で発表した内容です
ˏcosmeΞϓϦʹ͓͚ΔTextureͷ׆༻2018/09/01 iOSDC 2018 LT@aboy
View Slide
ࣗݾհ• Ѩอ༑• aboy/@suxisuxido• גࣜձࣾΞΠελΠϧ• iOSΤϯδχΞ/GoͰAPIΛॻ͖࢝ΊͨϚϯ
͢͜ͱ• ˏcosmeͱ͍͏εϚϗΞϓϦͷύϑΥʔϚϯεվળͷҰͱͯ͠ɺTextureΛҰ෦ͷը໘Ͱݕূͯ͠ΈͨͷͰͭΒͭΒͱ͢
ˏcosmeΞϓϦͷͭ͘Γ• MVVM/Clean Architecture + RxSwift• جຊ 1view <=> 1view model• xib/storyboardʹΑΔviewཧ• جຊ 1view <=> 1xib/storyboard• AutoLayout/UIStackViewΰϦΰϦͬͯΔ
ͱ͋Δը໘• iPod TouchͰಈ͔͢• ͍͍ͩͨ30~45fps ಈը
αΫαΫಈ͘Α͏ʹ͍ͨ͠
Textureͱ• Pinterest͕࡞ͬͯΔඇಉظUIϑϨʔϜϫʔΫ• ϨΠΞτܭࢉόοΫάϥϯυεϨουͰඇಉظతʹߦΘΕΔ • ϨΠΞτશͯίʔυͰߦ͏• CSS FlexboxϥΠΫͳಠࣗͷϨΠΞτAPI• UIKitͰ͍͏ViewTextureͰNodeͱݺͿ• UIKitͷओཁͳView˓˓NodeʹϦϓϨΠε͞ΕͯΔhttps://github.com/TextureGroup/Texture
Textureͷஔ͖͑
UIKit͔ΒTextureͷஔ͖͑• UITableViewController ->ASViewController• ՃಡΈࠐΈ tableNode(_ tableNode: ASTableNode,willBeginBatchFetchWith context: ASBatchContext)
UIKit͔ΒTextureͷஔ͖͑• UITableViewCell -> ASCellNode• UIView -> ASDisplayNode• ViewModelͦͷ··ར༻Մೳ• attributed stringisHiddenܥͷViewModelͰཧ͠ViewόΠϯσΟϯά
• ଞͷը໘Ͱ͍ͬͯΔڞ௨ύʔπ࠷ѱUIViewͷϥοϓͰରԠ• ͨͩ͠ϝΠϯεϨου͕ΘΕΔ UIKit͔ΒTextureͷஔ͖͑node = ASDisplayNode { () -> UIView inlet view = StarView(frame: CGRect.zero)view.configure(component.displayScore) //configurereturn view}
ϨΠΞτoverride func layoutSpecThatFits(_ constrainedSize: ASSizeRange) ->ASLayoutSpec {let baseStack = ASStackLayoutSpec.vertical()baseStack.spacing = 4.0 // UIStackView.Spacingvar verticalElements: [ASLayoutElement] = []if let messageNode = messageNode {verticalElements.append(messageNode)}verticalElements.append(contentNode)verticalElements.append(footerNode)baseStack.children = verticalElementsreturn ASInsetLayoutSpec(insets: UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0),child: baseStack)}
Textureʹஔ͖͑ͨ݁Ռ…
UIKit Textureಈը ಈը
UIKit Texture30~45fps 50~55fps
TextureUIKit- Layer Backing - Subtree RasterizationView Hierarchy
͓ΘΓʹ• TextureΛͬͯύϑΥʔϚϯεΛ͋ΔఔվળͰ͖ͨ • ϓϩμΫγϣϯίʔυʹΈࠐΉ͔·ͩݕ౼த• xib/storyboard͔Βͷஔ͖͑ͦ͜·Ͱ͘͠ͳ͍ҹ • ը໘୯ҐͰஔ͖͑Ͱ͖ΔɻStackLayout͕ศརͰϥΫɻςΩετͷ৭ϑΥϯτͷཧΛAttributedStringʹపఈͯ͠ΕͬͱϥΫͩͬͨ• UIܥϥΠϒϥϦͬͯΔͱશஔ͖͑ͦ͠͏• UIViewΛϥοϓͰ͖Δ͚ͲɺϝΠϯεϨου͕ΘΕΔͷͰϘτϧωοΫʹͳΔ͔