ããã«ã¡ã¯HabrïŒ
ææ°ã®ãªãŒãã³ãœãŒã¹éçºCGLayout
å¶éã«åºã¥ãããAutolayoutã«ç¶ãiOSã®2çªç®ã®ããŒã¯ã¢ããã·ã¹ãã ã玹ä»ããããšæããŸãã
ãå¥ã®èªåã¬ã€ã¢ãŠãã·ã¹ãã ...ãªãïŒäœã®ããïŒã -ããªãã¯ããããèããã
確ãã«ãiOSã³ãã¥ããã£ã¯æ¢ã«ããªãã®æ°ã®ã¬ã€ã¢ãŠãã©ã€ãã©ãªãäœæããŠããŸãããAutolayoutã¯èšããŸã§ããªãããããã®ã©ããæåã¬ã€ã¢ãŠãã®çã«å€§èŠæš¡ãªä»£æ¿ææ®µã«ãªããŸããã§ããã
CGLayout
ã¯æœè±¡ãšã³ãã£ãã£ãšé£æºããŸããããã«ãããUIViewãCALayerãåæã«äœ¿çšããŠã not rendered
ãªããžã§ã¯ãã§not rendered
ããŒã¯ã¢ãããæ§ç¯not rendered
ã ãŸããåäžã®åº§æšç©ºéããããããéå±€ã®ç°ãªãã¬ãã«ã«ããèŠçŽ éã«äŸåé¢ä¿ãæ§ç¯ã§ããŸãã ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§ã®äœæ¥ãå¯èœã§ããã£ãã·ã¥ã容æã§ãæ¡åŒµã容æã§ãããã«å€ãã®æ©èœããããŸãã
CGLayout
å€§èŠæš¡ãªãããžã§ã¯ãã«çºå±ããèŠèŸŒã¿ã®CGLayout
æ©èœçãªè£œåã§ãã
ããããåœåã¯ããã€ãã®ããã«ãããªãã®äººçãåçŽåãããšããç®æšãåœããåã§ããã
Autolayoutã®ããã©ãŒãã³ã¹ãäœãããããŸãã¯è€éãªããžãã¯ã®ããã«ã誰ããæåã¬ã€ã¢ãŠããäœæããå¿
èŠãããå ŽåããããŸãã ãããã£ãŠãããã€ãã®æ¡åŒµæ©èœã¯åžžã«æžãããŠããŸããïŒla setFrameThatFitsãªã©ïŒã
ãã®ãããªæ¡åŒµæ©èœãå®è£
ããããã»ã¹ã§ã¯ãããè€éãªé åºã®ã¢ã€ãã¢ãçºçããŸãããéåžžã®ããã«æéã®äžè¶³ã«ããããããã¯ãã¹ãŠTrelloã¬ã³ãŒãã®ãã¬ãŒã ã¯ãŒã¯å
ã«æ®ããæ°žä¹
ã«åæ¢ããŸãã
ããããããããå®çŸã«è³ããå°å¹³ç·ãèŠããªããªã£ããšããããªãã¯äžæ¯ã«ãªãã忢ããããšã¯ãã§ã«éçŸå®çã§ãã ããã§ããæéãç¡é§ã«ãªããªãã£ãããšãé¡ã£ãŠããŸãããã¬ãŒã ã¯ãŒã¯ã®æ©èœããªããã°ããµã³ãã«ã³ãŒããããã°ãç§ã®ãœãªã¥ãŒã·ã§ã³ã誰ãã®çæŽ»ãæ¥œã«ããŠãããããšãé¡ã£ãŠããŸãã
ç§ã®æ±ºå®ã®è©±ã«å ããŠãä»ã®ãã¬ãŒã ã¯ãŒã¯ãåæããŠæ¯èŒããããšããã®ã§ãããã¯éå±ã§ã¯ãªããšæããŸãã
æ¯èŒ
æ©èœæ§
å¿
èŠæ¡ä»¶ | ãã¬ãã¯ã¹ã¬ã€ã¢ãŠã | ASDK ïŒãã¯ã¹ãã£ïŒ | ã¬ã€ã¢ãŠãããã | èªåã¬ã€ã¢ãŠã | Cglayout |
---|
æ§èœ | + | + | + | - | + |
ãã£ãã·ã¥å¯èœæ§ | + | + | + | +- | + |
ãã«ãã¹ã¬ãã | - | + | + | - | + |
éå±€éã¬ã€ã¢ãŠã | - | - | - | + | + |
CALayerããã³ãã¬ã³ããªã³ã°ãªãããã¥ãŒã®ãµããŒã | - | + | - | - | + |
æ¡åŒµæ§ | - | + | + | - | + |
ãã¹ã¿ããªã㣠| + | + | + | + | + |
宣èšç | + | + | + | + | + |
ããã€ãã®ææšã¯äž»èгçãããããŸããããªããªã å®çšŒåç°å¢ã§ã¯ãããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŸããã§ããã ééããå Žåã¯ãä¿®æ£ããŠãã ããã
æ§èœ
ãã¹ãã«ã¯ã LayoutFrameworkBenchmarkã䜿çšãããŸããã
AsyncDisplayKitã¯ããã³ãããŒã¯éçºè
ã«ãã£ãŠå«ãŸããŠããªãã£ãããããã£ãŒãã«è¿œå ãããŸããã§ããããŸããASDKã¯ãããã¯ã°ã©ãŠã³ãã§ã¬ã€ã¢ãŠããå®è¡ããŸãããããã©ãŒãã³ã¹æž¬å®ã§ã¯å®å
šã«å
¬å¹³ã§ã¯ãããŸããã ãŸãã¯ãPinterestã¢ããªãèŠãããšãã§ããŸãã ããã®ããã©ãŒãã³ã¹ã¯æ¬åœã«å°è±¡çã§ãã
åæ
ãã§ã«å€ãã®ãã¬ãŒã ã¯ãŒã¯ã«é¢ããå€ãã®æ
å ±ããããŸããç§ã¯ç§ã®æèŠãå
±æããã ãã§ãã äž»ã«ãã¬ãã£ããªåŽé¢ã«ã€ããŠã話ããŸãããªããªãããããã¯ããã«æããã«ãªããããã¯ãã¬ãŒã ã¯ãŒã¯ã®ããŒãžã§èª¬æãããŠããããã§ãã
ã¬ã€ã¢ãŠãããã
Github 25ã®åé¡
éåžžã«æè»ã§ã¯ãããŸãããã倧éã®ã³ãŒããäœæããå®è£
ã«ããã°ã©ããååã«å«ããå¿
èŠããããŸãã LinkedIn以å€ã®ã¢ããªã±ãŒã·ã§ã³ã§LayoutKitã䜿çšããããšã«é¢ããæ
å ±ã¯èŠã€ãããŸããã§ããã
ããã§ããLayoutKitãç®æšãéæããªãã£ããšããæèŠããããLinkedInã¢ããªã±ãŒã·ã§ã³ã®ãã£ãŒãã¯äŸç¶ãšããŠé
ããªããŸãã
æ©èœïŒ
- éæšæºã®ããŒã¯ã¢ããããšã«ããã®ã¬ã€ã¢ãŠãã®å®è£
ã䜿çšããŠãµãã¯ã©ã¹ãäœæããå¿
èŠããããŸãã
- ã·ã¹ãã ã®äžæ žã¯ããã¥ãŒãäœæããŠåå©çšããããšã§ãã ãã¹ãŠã®ãã¥ãŒããã£ãã·ã¥ããããããå€éšãã¥ãŒãªã³ã¯ã䜿çšãããšåç
§æŽåæ§ãæãªãããå¯èœæ§ããããŸãã ã¯ããååãšããŠããã¥ãŒã¯ãããªãã¯ã€ã³ã¿ãŒãã§ã€ã¹ããã¯å©çšã§ããŸããã
- ã¬ã€ã¢ãŠããããã¯ïŒLabelLayoutãªã©ïŒã¯ãå€ãã®ãã¥ãŒæ
å ±ãè€è£œããŸãã ããããåæåãããšããããã©ã«ãå€ïŒããã¹ããªã©ïŒãèšå®ããå¿
èŠããããŸã
- èŠçŽ éã®çžå¯ŸçãªäŸåé¢ä¿ãäœæããæè»æ§ã¯ãããŸããã
FlexLayoutïŒå¥åYogaKitïŒ
Github 65ã®åé¡
ã¢ã€ã
ã¬ã€ã¢ãŠãã®ã¿ãåŠçããæ©èœãæäŸããŸãã ä»ã®ã°ããºããããããããŸããã
æ©èœïŒ
- ã¬ã€ã¢ãŠãããã£ãã·ã¥ããæ¹æ³ã¯ãããŸããã ãµã€ãºã®ã¿ååŸã§ããŸãã
- ãã€ãã£ãå®è£
ã§ã¯ãããŸããã APIã¯ãã¯ãã¹ãã©ãããã©ãŒã éçºè
ãWebéçºè
ã«ããé©ããŠããŸãã
- ç»é¢ã®ãµã€ãºå€æŽã«é¢ããåé¡-ã¬ã€ã¢ãŠããªããžã§ã¯ãã®ãµã€ãºãæåã§å€æŽããåã«ãŠã³ããè¡ãå¿
èŠããããŸãã
- ã¬ã€ã¢ãŠããããã¯ãæŽçãããšãã«ã远å ã®ãã¥ãŒãäœæããå¿
èŠããããŸãã
AsyncDisplayKitïŒãã¯ã¹ãã£ïŒ
Github 200ã®åé¡
ã¢ã€ã
Facebookã¯ãããé«ãã¬ãã«ã®ã¹ã¬ããã»ãŒããªæœè±¡åãäœæããŸããã UIKitããŒã«ã¹ã¿ãã¯å
šäœã®å®è£
ãå¿
èŠã«ãªã£ãçç±ã éãã©ã€ãã©ãªã§ãã䜿çšããããšã«ããå ŽåãåŸã§æåŠããããšã¯ã§ããŸããã ããã§ããããã¯äŸç¶ãšããŠæãæèœã§éçºããããªãŒãã³ãœãŒã¹ãœãªã¥ãŒã·ã§ã³ã§ãã
æ©èœïŒ
- çµã¿èŸŒã¿ã®ãšã¬ãé€ãä»ã®ã¬ã€ã¢ãŠããã¬ãŒã ã¯ãŒã¯ãšã®äºææ§ã¯ãããŸããã
- ASDisplayNodeãµãã¯ã©ã¹ã䜿çšããå¿
èŠããããŸãã UIKitã§ã®äœæ¥ãæ¬è³ªçã«é€å€ããŸãã ASDKã䜿çšããããšã«æ±ºããã®ã§ãä»ã®ããŒã«ãå¿ããUIã®ä»£ããã«æžãããšã«æ
£ããããšãã§ããŸã...ãAS ....
- 倿°ã®UIKitã¡ã«ããºã ã®ç¬èªã®å®è£
ãããã«ãããã³ãŒãã®é³è
åãšAppleã®å®è£
ãšã®å€§ããªäžäžèŽãAppleãªãªãŒã¹ã«é¢é£ããªããã°ãçããå¯èœæ§ããããŸãã
- 芪æãªããµããŒãã
- åé¡ã®è§£æ±ºã«é¢é£ããæ
å ±ã¯ã»ãšãã©ãããŸããã StackOverflowã§æååãAsyncDisplayKitãã䜿çšããŠæ€çŽ¢ãããšã181åã®äžèŽãèŠã€ãããŸãïŒæ¯èŒã®ããããUIKitãã¯66,550ã§ãïŒã
Cglayout
- UIViewã¬ãã«ãšCALayerã¬ãã«ã®äž¡æ¹ã§äœ¿çšããŸãã ã¬ã€ã€ãŒã®äœçœ®ã«ãã£ãŠãã¥ãŒãçµã¿åãããããå¶éãããã§ããŸããéãåæ§ã§ãã
not rendered
ãªããžã§ã¯ãã䜿çšããæ©èœã - ç°ãªããªããžã§ã¯ãã®ã¬ã€ã¢ãŠã仿§ãåå©çšããŸãã
- éå±€éã®äŸåé¢ä¿ãäœæããæ©èœã
- å³å¯ãªã¿ã€ãã³ã°ã
- ã¹ãããã·ã§ãããååŸããŠããŒã¯ã¢ããããã£ãã·ã¥ããŸãã
- ç°å¢ã«äŸåããªãã«ã¹ã¿ã å¶éã®äœæã ããšãã°ãã©ãã«ã®è¡ãµã€ãºå¶éã
- ãã¥ãŒã®ã¬ã€ã¢ãŠãã¬ã€ããšãã¬ãŒã¹ãã«ããŒã®ç°¡åãªäœæã®ãµããŒãã
- 䜿çšå¯èœãªã¬ã€ã¢ãŠãïŒçŽæ¥ãèæ¯ããã£ãã·ã¥ïŒããµããŒãããŸãã
- UIKitãšã®ç°¡åãªçµ±åã
- ç°¡åã«æ¡åŒµå¯èœã
çŸåšã®å¶éïŒ
- ããã°ã©ãã¯ãã¬ã€ã¢ãŠãã¹ããŒã ãå®çŸ©ããŠå¶çŽãé©çšããéã«äžè²«æ§ã«ã€ããŠèããå¿
èŠããããŸãã
layer
ããããã£ã䜿çšããŠUIViewã®ã¬ã€ã¢ãŠããèšç®ãããšãUIViewã®frame
ãæé»çã«å€æŽãããå¯äœçšïŒdrawRectãlayoutSubviewsãªã©ïŒãåŒã³åºãããªããããæªå®çŸ©ã®åäœãçºçããŸãã åæã«ãUIViewã®ã¬ã€ã€ãŒãå¥ã®ã¬ã€ã€ãŒã®å¶éãšããŠç°¡åã«äœ¿çšã§ããŸãã- ã¹ãŒããŒãã¥ãŒã®çŸåšã®
bounds
å€ãšã¯ç°ãªããã¬ãŒã ã®ã¹ãããã·ã§ãããåä¿¡ããã¹ãŒããŒãã¥ãŒã«åºã¥ããå¶éãããå Žåãäºæããªãçµæãçããå¯èœæ§ããããŸãã - 確çå¶çŽã®ããè€éãªã¬ã€ã¢ãŠãã«ã¯ãŸã ããŸãé©å¿ããŠããŸããã
- UIViewãšCALayerã®éã«å¶éãããããŒã¯ã¢ããã®èšç®ã¯ãå®è£
ã§åº§æšã倿ããå¿
èŠãããããé
ããªããŸãã
ãŸã å®è£
ãããŠããªããã®ïŒ
- RTLãµããŒãã
- éå±€ãããã¥ãŒãåé€ãããšãã®åäœã
- macOSãtvOSããµããŒãããŸãã
- ç¹æ§ã³ã¬ã¯ã·ã§ã³ã®ãµããŒãã
- åå©çšå¯èœãªãã¥ãŒãããŒã¯ããããã®äŸ¿å©ãªãã¶ã€ã³ã¯ãããŸããã
- çŸåšã®ã¬ã€ã¢ãŠãæ§æãåçã«å€æŽããŸãã
CGLayoutã®å®è£
CGLayout
ãSwiftèšèªã®çŸä»£ã®ååã«åºã¥ããŠæ§ç¯ãããŠããŸãã
CGLayoutã§ã®ããŒã¯ã¢ãã管çã®å®è£
ã¯ã RectBasedConstraint
ã RectBasedLayout
ã RectBasedConstraint
3ã€ã®åºæ¬ãããã³ã«ã«åºã¥ããŠãLayoutItem
ã
èŠçŽLayoutItem
Iãå®è£
ãããã¹ãŠã®ãšã³ãã£ãã£ã¯ã¬ã€ã¢ãŠãèŠçŽ ãåŒã³åºããä»ã®ãã¹ãŠã®ãšã³ãã£ãã£ã¯åãªãã¬ã€ã¢ãŠããšã³ãã£ãã£ã§ãã
åºæ¬çãªããŒã¯ã¢ãã
public protocol RectBasedLayout { func layout(rect: inout CGRect, in source: CGRect) }
RectBasedLayout
ã¬ã€ã¢ãŠãã倿Žããããã®åäœã宣èšãããã®ããã®1ã€ã®ã¡ãœãããå®çŸ©ããŸããå©çšå¯èœãªã¹ããŒã¹ãåºæºã«ããæ¹åä»ããå¯èœã§ãã
RectBasedLayout
ãããã³ã«ãå®è£
ããLayout
æ§é ã¯ãã¬ã€ã¢ãŠãèŠçŽ ã®å®å
šãã€ååãªã¬ã€ã¢ãŠããæ±ºå®ããŸãã äœçœ®æ±ºããšå¯žæ³ã
ãããã£ãŠã Layout
ã¯2ã€ã®èŠçŽ ã«åå²ãããŸãïŒé
眮Layout.Alignment
ãšå¡ãã€ã¶ãLayout.Filling
ã§ãã ãããã¯ãæ°Žå¹³ããã³åçŽã¬ã€ã¢ãŠãã§æ§æãããŠããŸãã ãã¹ãŠã®æ§æèŠçŽ ã¯RectBasedLayout
å®è£
ãRectBasedLayout
ã ããã«ãããããŸããŸãªã¬ãã«ã®è€éãã®ã¬ã€ã¢ãŠãèŠçŽ ã䜿çšããŠããŒã¯ã¢ãããå®è£
ã§ããŸãã ãã¹ãŠã®ãšã³ãã£ãã£ã¬ã€ã¢ãŠãã¯ãå®è£
ã«ãã£ãŠç°¡åã«æ¡åŒµã§ããŸãã
ã¬ã€ã¢ãŠãæ§é ã®è€åå³ïŒ å¶éäºé
ãã¹ãŠã®å¶éã¯RectBasedConstraint
ã«ãã£ãŠå®è£
ããRectBasedConstraint
ã RectBasedLayout
ãšã³ãã£ãã£ãå©çšå¯èœãªã¹ããŒã¹ã§ããŒã¯ã¢ãããå®çŸ©ããå Žåã RectBasedConstraint
ãšã³ãã£ãã£RectBasedConstraint
ãã®å©çšå¯èœãªã¹ããŒã¹ãRectBasedConstraint
ããŸãã
public protocol RectBasedConstraint { func constrain(sourceRect: inout CGRect, by rect: CGRect) }
LayoutAnchor
ã¯ãç°å¢ããæœè±¡åãããåäœãæã€ç¹å®ã®åºåãæåïŒãµã€ãããµã€ãºãªã©ïŒãå«ãŸããŸãã
çŸæç¹ã§ã¯ãäž»ãªãªããã¿ãŒãå®è£
ãããŠããŸãã
LayoutAnchoræ§é ã®è€åå³ïŒ ã¬ã€ã¢ãŠãã®å¶çŽ
public protocol LayoutConstraintProtocol: RectBasedConstraint { var isIndependent: Bool { get } func layoutItem(is object: AnyObject) -> Bool func constrainRect(for currentSpace: CGRect, in coordinateSpace: LayoutItem) -> CGRect }
ã¬ã€ã¢ãŠãèŠçŽ ãŸãã¯ã³ã³ãã³ãïŒããã¹ããç»åãªã©ïŒãžã®äŸåãæ±ºå®ããŸãã ãããã¯ãå¶çŽã®ãœãŒã¹ãšäœ¿çšãããå¶çŽã«é¢ãããã¹ãŠã®æ
å ±ãå«ãèªå·±å®çµåã®å¶çŽã§ãã
LayoutConstraint
ç¹å®ã®åºåãæåã»ãããæã€ã¬ã€ã¢ãŠãèŠçŽ ã«é¢é£ä»ããããå¶çŽã
AdjustLayoutConstraint
ã¬ã€ã¢ãŠãèŠçŽ ã«é¢é£ä»ããããå¶çŽã«ã¯ããµã€ãºããŒã¹ã®å¶çŽãå«ãŸããŸãã AdjustableLayoutItem
ãããã³ã«ããµããŒãããã¬ã€ã¢ãŠãèŠçŽ ã§äœ¿çšã§ããŸãã
ã¬ã€ã¢ãŠãèŠçŽ
public protocol LayoutItem: class, LayoutCoordinateSpace { var frame: CGRect { get set } var bounds: CGRect { get set } weak var superItem: LayoutItem? { get } }
UIViewãCALayerãªã©ã®ã¯ã©ã¹ã«ãã£ãŠå®è£
ããã not rendered
ããŠnot rendered
ã¯ã©ã¹ãå®è£
ãnot rendered
ãŸãã ã¹ã¿ãã¯ãã¥ãŒãªã©ã®ä»ã®ã¯ã©ã¹ãå®è£
ããããšãã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ã¯LayoutGuideã®å®è£
ããããŸãã ããã¯UIKitã®UILayoutGuideã«äŒŒãŠããŸãããèŠçŽ ããã¡ã¯ããªåããæ©èœããããŸãã ããã«ãããLayoutGuideããã¬ãŒã¹ãã«ããŒãšããŠäœ¿çšã§ããŸããããã¯ãææ°ã®èšèšãœãªã¥ãŒã·ã§ã³ã«ç
§ãããŠéåžžã«éèŠã§ãã ç¹ã«ãViewPlaceholderã¯ã©ã¹ã¯ãããã®ç®çã®ããã«äœæãããŠããŸãã UIViewControllerãšåããã¥ãŒèªã¿èŸŒã¿ãã¿ãŒã³ãå®è£
ããŸãã ãããã£ãŠã圌ãšäžç·ã«ä»äºãããããšã¯éåžžã«éŠŽæã¿ã®ãããã®ã§ãã
ãµã€ãºãèšç®ã§ããèŠçŽ ã®å Žåããããã³ã«ã宣èšãããŸãïŒ
public protocol AdjustableLayoutItem: LayoutItem { func sizeThatFits(_ size: CGSize) -> CGSize }
ããã©ã«ãã§ã¯ãUIViewã®ã¿ãå®è£
ããŸãã
ã¬ã€ã¢ãŠã座æšç©ºé
public protocol LayoutCoordinateSpace { func convert(point: CGPoint, to item: LayoutItem) -> CGPoint func convert(point: CGPoint, from item: LayoutItem) -> CGPoint func convert(rect: CGRect, to item: LayoutItem) -> CGRect func convert(rect: CGRect, from item: LayoutItem) -> CGRect var bounds: CGRect { get } var frame: CGRect { get } }
ã¬ã€ã¢ãŠãã·ã¹ãã ã«ã¯ã LayoutCoordinateSpace
ãããã³ã«ã®åœ¢åŒã§è¡šç€ºãããçµ±å座æšã·ã¹ãã ããããŸãã
åã¿ã€ãã®åºæ¬å®è£
ïŒUIViewãCALayerãUICoordinateSpace +çžäºå€æã®ããã®ç¬èªã®å®è£
ïŒã䜿çšããªããããã¹ãŠã®ã¬ã€ã¢ãŠãèŠçŽ ã«å¯ŸããŠåäžã®ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
ã¬ã€ã¢ãŠããããã¯
public protocol LayoutBlockProtocol { var currentSnapshot: LayoutSnapshotProtocol { get } func layout() func snapshot(for sourceRect: CGRect) -> LayoutSnapshotProtocol func apply(snapshot: LayoutSnapshotProtocol) }
ã¬ã€ã¢ãŠããããã¯ã¯ãã¬ã€ã¢ãŠãã®å®å
šãã€ç¬ç«ãããŠãããã§ãã ããŒã¯ã¢ãããå®è¡ããã¹ãããã·ã§ãããåä¿¡/é©çšããããã®ã¡ãœãããå®çŸ©ããŸãã
LayoutBlock
ã¯ãã¬ã€ã¢ãŠãèŠçŽ ããã®ã¡ã€ã³ã¬ã€ã¢ãŠããããã³LayoutConstraintProtocolãå®è£
ããå¶çŽãã«ãã»ã«åããŸãã
ããŒã¯ã¢ãããæŽæ°ããããã»ã¹ã¯ãå¶éã䜿çšããŠäœ¿çšå¯èœãªã¹ããŒã¹ã決å®ããããšããå§ãŸããŸãã ã·ã¹ãã ã¯ãŸã ç«¶åå¶éã®åé¡ã解決ãããã©ã®ãããªæ¹æ³ã§ãåªå
é äœãä»ããªããããå¶éã®é©çšã«æ
éã«åãçµãå¿
èŠãããããšã«çæããŠãã ããã ãããã£ãŠãäžè¬çã«ããµã€ãºããŒã¹ã®å¶çŽïŒAdjustLayoutConstraintïŒã¯ãäœçœ®ããŒã¹ã®å¶çŽã®åŸã«é
眮ããå¿
èŠããããŸãã ã¹ãŒããŒãã¥ãŒã®ã¹ããŒã¹ïŒå¢çïŒããœãŒã¹ã¹ããŒã¹ãšããŠäœ¿çšãããŸãã åå¶éã«ããã䜿çšå¯èœãªã¹ããŒã¹ã倿ŽãããŸãïŒããªã ãã·ãããã¹ãã¬ãããªã©ïŒã å¶éãæ©èœãããšãçµæã®ã¹ããŒã¹ãLayout
ã«è»¢éãããããã§èŠçŽ ã®å®éã®ããŒã¯ã¢ãããèšç®ãããŸãã
LayoutScheme
ã¯ãä»ã®ã¬ã€ã¢ãŠããããã¯ãçµã¿åãããŠãããŒãã³ã°ã®æ£ããã·ãŒã±ã³ã¹ã決å®ãããããã¯ã§ãã
ã¬ã€ã¢ãŠãã®ã¹ãããã·ã§ãã
public protocol LayoutSnapshotProtocol { var snapshotFrame: CGRect { get } var childSnapshots: [LayoutSnapshotProtocol] { get } }
LayoutSnapshot
äžé£ã®ãã¬ãŒã ãšããŠè¡šç€ºãããã¹ãããã·ã§ããã§ãã¬ã€ã¢ãŠãèŠçŽ ã®éå±€ãä¿æããŸãã
å»¶é·
ãã¹ãŠã®æ¡åŒµå¯èœãªèŠçŽ ã¯ãæ¡åŒµãããã³ã«ãå®è£
ããŸãã
public protocol Extended { associatedtype Conformed static func build(_ base: Conformed) -> Self }
ãããã£ãŠãæ©èœãæ¡åŒµãããšãã«ã CGLayout
æ¢ã«å®çŸ©ãããŠããåã䜿çšããŠãå³å¯ã«åæå®ãããã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ã§ããŸãã
䜿çšäŸ
CGLayoutã¯ãäžé£ã®æŽæ°ãã¬ãŒã ãæ§ç¯ãããšããæå³ã§ãæåã¬ã€ã¢ãŠããšã»ãšãã©å€ãããŸããã CGLayoutã§ããŒã¯ã¢ãããå®è£
ããå Žåãããã°ã©ããŒã¯ãäœæ¥ãéå§ããåã«ãã¹ãŠã®å¶éãå®éã®ãã¬ãŒã ã«é©çšãããªããã°ãªããªãããšãèŠããŠããå¿
èŠããããŸãã
let leftLimit = LayoutAnchor.Left.limit(on: .outer) let topLimit = LayoutAnchor.Top.limit(on: .inner) let heightEqual = LayoutAnchor.Size.height() ... let layoutScheme = LayoutScheme(blocks: [ distanceLabel.layoutBlock(with: Layout(x: .center(), y: .bottom(50), width: .fixed(70), height: .fixed(30))), separator1Layer.layoutBlock(with: Layout(alignment: separator1Align, filling: separatorSize), constraints: [distanceLabel.layoutConstraint(for: [leftLimit, topLimit, heightEqual])]) ... ]) ... override public func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() layoutScheme.layout() }
ãã®äŸã§ã¯ããã®ã©ãã«ã®äœçœ®ã決å®ãããåŸãã»ãã¬ãŒã¿ãŒã¯distanceLabel
å¶çŽã䜿çšããŸãã
ãŸãšã
èªåã¬ã€ã¢ãŠãã¯ãå®å®æ§ãåªããAPIã匷åãªãµããŒãã«ãããäŸç¶ãšããŠã¬ã€ã¢ãŠãã®ã¡ã€ã³ããŒã«ã§ãã ãããããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã¯ãçŠç¹ãçããæè»æ§ããããããç¹å®ã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãã
CGLayout
ã¯ãã¬ã€ã¢ãŠãããã»ã¹ãèšè¿°ããããã®éåžžã®ããžãã¯ããŸã£ãããªããããããçšåºŠæ
£ããå¿
èŠããããŸãã
ãŸã å€ãã®äœæ¥ããããŸãããããã¯æéã®åé¡ã§ããããã®ãããªã·ã¹ãã ã®åéã§ããããå ããããšãã§ããå€ãã®å©ç¹ãããããšã¯ãã§ã«æããã§ãã ãã¬ãŒã ã¯ãŒã¯ã®åäœã¯ãŸã å®çšŒåç°å¢ã§ãã¹ããããŠããªãããã詊ããŠã¿ãæ©äŒããããŸãã ãã¬ãŒã ã¯ãŒã¯ã¯ãã¹ãã§ã«ããŒãããŠããããã倧ããªåé¡ã¯ãããŸããã
ãã¬ãŒã ã¯ãŒã¯ã®ãããªãéçºã«ç©æ¥µçã«åå ããŠããã ããã°å¹žãã§ãã
Githubãªããžããª
ãããŠæåŸã«ãHabr-usersã«è³ªåããããšæããŸãã
ã¬ã€ã¢ãŠãã·ã¹ãã ã®èŠä»¶ã¯äœã§ããïŒ
ã¬ã€ã¢ãŠãã®æ§ç¯ã§æãå«ããªããšã¯äœã§ããïŒ