æšæ¥ã¯ @kikuchy ã«ããFlutterããããã¯ã·ã§ã³å°å
¥ãã話ã§ããã
ãããã¯ã·ã§ã³ã§Flutterãå°å
¥ãããšããæ»ãã®éçºãããŠããyoubrideããŒã ã§ããããã²ãããããåŸãããç¥èŠãå
±æããŠãããããšæããŸã ![]()
æ¬æ¥ã¯ãããªFlutterããäžè»¢ãPoiboyã®iOSã¢ããªéçºã§è¡ã£ãSafe Area察å¿ã«ã€ããŠã®ã話ããéãããããšæããŸãã
ãããã: ã³ãŒãã§ã®ç«¯æ«å€å®ã«ã€ããŠ
ã¿ãªããã®iOSã¢ããªã§ã¯ã³ãŒãã§ããã€ã¹å€å®ããŠåå²ããŠããŸãã ![]()
䞻芳ã«ã¯ãªããŸããã Auto Layoutã ãã§å
šç«¯æ«ã®ã¬ã€ã¢ãŠããå®çŸã§ããŠããã±ãŒã¹ã¯ããå€ããªãã®ã§ã¯ãšæã£ãŠããŸãã
äŸãã°èšäºã®ã¿ã€ãã«ã«ãããããã«ã isIPhoneX ã®ãããªãã©ã°ãèŠãŠã倧ããªããã€ã¹ãšå°ããªããã€ã¹ã§åå²ããã¿ãããªå®è£
ãããŠããã±ãŒã¹ãå€ãããšæããŸãã
èªèº«ãããããã³ãŒãã§ã®ããã€ã¹å€å®ãäœåºŠãå®è£
ããããšããããŸãã
ã³ãŒãã§ã®ç«¯æ«å€å®ã«ãããåé¡ç¹
ããããã®ãããªãã©ã°ã¯ã端æ«ããªãšãŒã·ã§ã³å¢å ã®åºŠã«è¿œå ãå¿
èŠã«ãªããŸãã
æ°ãã端æ«ãçºè¡šãããéœåºŠ
if isIPhoneXr { ... }
ã
let isWideDevice = isIPhone6Plus || isIPhone6sPlus || ... || isIPhoneXsMax
ã®ãããªå®è£
ãå¢ãããšã åã«ããžãã¯ã®åå²ãå¢ããŠèŠéããæªããªãã ãã§ãªããæå³ããªãUIäžæŽåã®æž©åºã«ããªããŸãã
åœããåã§ãã Appleãå
¬åŒã«ãä»ã¯ãŸã ååšãªãæ°ããããã€ã¹ã«ã€ããŠããAuto Layout察å¿ããŠããã°UIãããŸãé©åãããããšãã§ãã 1ããšèšã£ãŠããŸãã
ãªã®ã§æ¬æ¥ã§ããã°ããã®ãããªãã©ã°ãäœãæç¹ã§ä»æ§ãå®è£
æ¹éãçã£ãæ¹ãè¯ãã®ãããããŸããã
å®ã¯èªåã®ãããã¯ãã§ããPoiboyã§ããæ¹ããŠã³ãŒãã調ã¹ããšãããããããã®æ°ã®ããã€ã¹å€å®ç®æãèŠã€ããŠããŸããŸãã ![]()
ãã¡ãããããã¯å
šãŠ æŽå²ççµç·¯çã®çç±ãããããªããããã£ãå®è£
ã«ãªã£ãŠããããã§ãã
ã§ããããã¯ãçŽãããšããã¯æ©ãã«çŽããŠããããã§ããã ![]()
ããã§å
æ¥ãPoiboy iOSã§ããããã€ã¹å€å®ããžãã¯ã®äœ¿çšç®æã®èª¿æ»ãšé€å»ã«TRYããŸããã
ãã®äžã§ãããããããã€ã¹å€å®ç®æãã§ããèæ¯ã«ããã€ãã®ãã¿ãŒã³ããã£ãã®ã§ããã®èšäºã§ã¯ãããæŽçããŠãŸãšããŠã¿ãŸããã
ãçŽããªããŠãåããç³»ã®åé¡ã§ã¯ãããŸãããä»å¯Ÿå¿ããŠããããšã§é·æçã«ã¯ç¡é§ãªã¡ã³ããã³ã¹ã³ã¹ãããªããªãæ©æµãåããããã¯ãã§ãã
ããããã¿ã¹ã¯ããPoiboyããŒã ã§ã¯æ¹å掻åã®äžã§åãçµãããšãã§ããŸãã
ãªãæ¹å掻åãæã«å
¥ãããŸã§ã®èæ¯ã«ã€ããŠã¯åŒç€ŸDiverseã®å匷äŒã«ãŠçºè¡šããŠãããŸã2ã®ã§ããã¡ãã®è³æãã芧ããã ããã°ãšæããŸãã
ããã€ã¹å€å®ããžãã¯ãçºçããåå
ããŠæ¬é¡ã§ãã
èªåã調ã¹ãç¯å²ã«ãããŠã ããã€ã¹å€å®ãçºçããçç±ã¯ä»¥äžã®éãã§ããã
- ããããAuto Layout / Safe Areaãããããããªããã
- æ¢åã¬ã€ã¢ãŠãã®ä¿®æ£ãé¢åã ãã
- é£ç¶çã§ã¯ãªã颿£çã«ã¬ã€ã¢ãŠããå¶åŸ¡ããããã
- iPadã§ã®è¡šç€ºããµããŒãããå¿ èŠããã£ããã
- å šç»é¢ã§è¡šç€ºããç»åãå¿ èŠã ãã
1. ããããAuto Layout / Safe Areaãããããããªããã
æŠèŠ
Auto LayoutãSafe Areaã«èŠææèã®ããããããã¯çè§£ã远ãã€ããŠããªããšããæ¹ãã¡ãããšå匷ããªããšãªããšæãã€ã€ãã£ãŠããªãæ¹ã¯ãå¿åœããããããããããŸãã ![]()
èªåãSafe Areaãåºãåœåã¯ããŸãè¯ãããã£ãŠãããããã£ãã察å¿ã§ããã«æŸçœ®ããç®æããããŸããã
Safe Area Layoutã䜿ããã«iPhone X察å¿ãããŠããç®æã¯ã ã ãããã®ã±ãŒã¹ã§ãããŒViewã®å¶çŽãä»ãæ¿ãããConstantãå€ããããšã«ãã£ãŠå®çŸãããŠããããšãå€ãã§ãã
ãã®å Žåã 端æ«ã®å€§ãããSafe Areaå€ã®UI倿Žã«å€§ãã圱é¿ãåããŠããŸããŸãã®ã§ãããæ¹ãè¯ãã§ãããã
äŸãã°ãããªã¬ã€ã¢ãŠãã
ããããããŒã ã€ã³ãžã±ãŒã¿é åã«èæ¯ãããã£ãŠããŠããã¿ã³ã®ã¿ããé åã¯Safe Areaå
ã«çœ®ãããã±ãŒã¹ã§ãã
Poiboyã®ã¢ããªã確èªãããšãããSafe Areaãããåãããã«å¯Ÿå¿ããŠãããããããã®ãããªããã€ã¹å€å®ãã©ã°ã§ãããŒViewãæ¿å
¥ããŠããã®ã§ãã
å¯Ÿå¿æ¹é
ãã®å Žå
- èæ¯ã¯ãã¿ã³äžç«¯ããSuper Viewã®äžç«¯(=Safe Areaå€)ãŸã§
- ãã¿ã³é åã¯SafeãAreaã®äžç«¯(=Safe Areaå )ãŸã§
ã®é«ãå¶çŽãã€ããããšã§å¯Ÿå¿ã§ããŸãã
å®éãã£ãŠã¿ããšããããæãã§ããã
ãã®ããã«ãSafe Areaå€ã«ã¯ã³ã³ãã³ããšããŠæäœå¯èœãªãã®ã¯çœ®ããªãããèæ¯ãªã©æäœã«é¢ä¿ãªããã®ã¯çœ®ããŠè¯ãããã§ãã
ã«ãŒãã®Viewã ãã§ã¯ãªããåã®Viewã§ãSafe Area Layoutã䜿ãããšãã§ããã®ã§ãç¡çã«ã«ãŒãã®Safe Areaã«å¶çŽãä»ããªããŠã倧äžå€«ã§ãã
é¢åãããããŸããããã³ã³ãã³ããšèæ¯ãåããããã§ãSafe Areaãšç»é¢é åã®ã©ã¡ãã«ãã£ã€ããã®ããèãããšè¯ãã§ãããã
2. æ¢åã¬ã€ã¢ãŠãã®ä¿®æ£ãé¢åã ãã
æŠèŠ
äžèšãšäŒŒãŠããŸãããæ¢åã®ã¬ã€ã¢ãŠãããã¡ããã¡ãã ã£ããèŠã«ããå Žåã«ãã¬ã€ã¢ãŠããçµã¿çŽãã®ãé¢åãªã®ã§ãšãããããããŒViewã§å¯Ÿå¿ãããšããã±ãŒã¹ããããŸãã
å
çšãšäŒŒãäŸã§ãããä»åºŠã¯ãã®ããã«äžããã¢ãã¡ãŒã·ã§ã³ããŠåºãŠããå ŽåãèããŸãã
Safe Areaå€ã«ãUILabel ãé
眮ãããŠããŸã£ãŠããã®ãããããã§ãããã ![]()
ãã¡ãã衚瀺ããããViewã®äžéšãBottom Layout Guideã«ãã£ã€ããŠããŸããã
ãã®ããã iPhone Xã®ã¿Viewã®çžŠæšªæ¯å¶çŽã眮æããŠããã€äžéšã®ããŒãžã³ãèšå®ããããšã§ç¡çãããSafe Areaå
ã«åããããšããŠããŸããã
if isIPhoneX {
// äºåã«IBOutletã§è¡šç€ºããããViewã®çžŠæšªæ¯ã«é¢ããå¶çŽãçŽã¥ã
if let aspectLayoutConstraint = self.otherAccountViewAspectLayoutConstraint {
// éåžžã®å¶çŽãå€ããŠæ°ããå¶çŽã«çœ®æ
self.otherAccountView.removeConstraint(self.otherAccountViewAspectLayoutConstraint)
let newAspectLayoutConstraint = NSLayoutConstraint(
item: aspectLayoutConstraint.firstItem!,
attribute: aspectLayoutConstraint.firstAttribute,
relatedBy: aspectLayoutConstraint.relation,
toItem: aspectLayoutConstraint.secondItem,
attribute: aspectLayoutConstraint.secondAttribute,
multiplier: CGFloat(375) / CGFloat(279),
constant: 0)
self.otherAccountView.addConstraint(newAspectLayoutConstraint)
self.otherAccountViewAspectLayoutConstraint = newAspectLayoutConstraint
}
// ããããžãã¯ç¡çããç»é¢ç«¯ããã®ããŒãžã³ãäœã£ãŠãã
self.otherAccountBottomViewHeightLayoutConstraint.constant = 53
self.snsNotificationLabelTopMarginLayoutConstraint.constant = 9
self.snsNotificationLabelCenterYLayoutConstraint.priority = .defaultLow
self.snsNotificationLabelTopMarginLayoutConstraint.priority = .defaultHigh
}
å çšã®äŸãšç°ãªãã®ã¯ã å¶çŽã®ä»ãæ¿ãã«ãã£ãŠã¢ãã¡ãŒã·ã§ã³ããŠããç¹ã§ãã
ãããŒViewããããŠãã¿ã³ã®ViewãSafe Areaå
ã«åãããšãSafe Areaå€ã®éšåã¯ã¢ãã¡ãŒã·ã§ã³ãããŸããã
ãããå¶çŽãè€æ°IBOutletã§ã€ãªãã£ãŠããããã芪Viewãå€ããã®ã¯å°ã
é¢åã§æŸçœ®ããããšããããã§ããã
å¯Ÿå¿æ¹é
ããã§ã èæ¯çšã®Viewã芪Viewã§ã¯ãªãåãéå±€ã«çœ®ãããã¡ãããã¿ã³äžéšãšBottom Layout Guideã«ãã£ã€ããããšã§ãSafe Areaå€ã§ãæ±ããŠããã¢ãã¡ãŒã·ã§ã³ãå®çŸããããšãã§ããŸãã
ãããšãããªæãã§åããŸãã
ãã¯ããã¡ãã«ã€ããŠãã èæ¯ãšã³ã³ãã³ããåãããšããèŠç¹ãæã€ããšã§ãã¢ãã¡ãŒã·ã§ã³ããã£ãŠãã·ã³ãã«ãªå®è£ ã§å¯Ÿå¿ããããšãã§ãããã§ãã
3. é£ç¶çã§ã¯ãªã颿£çã«ã¬ã€ã¢ãŠããå¶åŸ¡ããããã
æŠèŠ
(ãã©ã³ã以å€ã®äŸããªãã£ãã®ã§ããã§ã¯ãã©ã³ãã«çµã£ãŠè©±ãããŸã)
Auto Layoutã§ã¯ãé£ç¶çãªå€åããããããšã¯ç¹ç°ã§ããã颿£çãªå€åããããããšã¯é£ãããšæã£ãŠããŸã(ããæ¹ã¯ãããšã¯æããŸãã)ã
äŸãã°**ãéåžž18ptã®ãã©ã³ããµã€ãºãiPhone SE(widthã320px以äž)ã§ã¯16ptã«ãããã¿ãããªããšã§ãã**
ã³ãŒãã ãšãã®ãããªå®è£
ã«ãªã£ãŠããŸããã
if isIPhoneSe {
view.titleLabel.font = UIFont(name: "HiraginoSans-W6", size: 13)
view.descriptionLabel.font = UIFont(name: "HiraginoSans-W3", size: 11)
}
Size Classes3ã䜿ãããšã§ãInterface Builderäžã§ã©ã³ãã¹ã±ãŒãã¢ãŒããiPadçã®ã«ããŽãªããšã«å¥ã®å€ãæå®ããããšã¯å¯èœã§ãã
ããããã®æ¹æ³ã§ã¯iPhone X以åã®ç«¯æ«ã¯åãã«ããŽãªã«åé¡ãããŸããã现ããããã€ã¹ããšã«UIãæå®ããã®ã«ã¯äœ¿ããŸããã
å¯Ÿå¿æ¹é
ãã©ã³ãã§ããã°Minimum Font ScaleãMinimum Font Sizeã®é ç®ãå ¥ããããšã§ãäžå®ãµã€ãºãŸã§ã¯èªåçã«çž®å°ããããŠãããŸãã
ãªã®ã§èº«ãèããªãçµè«ã§ãã**ãé£ç¶çã«å€åãããããã«ããããšããããšã«ãªããšæããŸãã**
é£ç¶çãªå€åã®ã€ã¡ãŒãžå³
Poiboyã§ã¯åºæ¬çã«Minimum Font Scaleã0.5ãŸã§ã¯èš±å®¹ãããšãããã¶ã€ã³ã«ãŒã«ãèšããŠããŸãã
ããã«åŸãã°ãæç€ºçã«ãµã€ãºãæå®ãããšãèªåçã«çž®å°ãããããŸãããäžéšã§ãªããæç€ºçã«å€ãããŠããç®æããã£ãã®ã§ãããä¿®æ£ããæ¬¡ç¬¬ã§ãã
ãããŸã§ ãã©ã³ããµã€ãºã¯ãã¡ããæç€ºçã«æå®ãããAuto Layoutã«èªåèšç®ããããšããã®ãè¯ãã®ã§ã¯ãªãããšæããŸãã
4. iPadã§ã®è¡šç€ºããµããŒãããå¿ èŠããããã
æŠèŠ
ãããŸã§iPhoneå°çšã¢ããªãiPadã§åãããšãæ¯çã3:2ã§è¡šç€ºãããŠããŸãã(iPad Proé€ã)ã
ãã®ããäžéšã®ç»é¢ã§Viewãå
¥ããããªã or 朰ããŠããŸãéšåããããŸããã
ãããé²ãããã isIPhone4s ã®ãããªãã©ã°(ãµã€ãºã§ã¯ãªãæ¯çã§å€å®ããŠãã)ã䜿ããäžéšã®èŠçŽ ãé衚瀺ã«ããã¿ãããªããšãããŠãç®æããããŸããã
ãŠãããŒãµã«ã¢ããªã¯ã¡ãããšå¯Ÿå¿ããªããšã§ãããiPhoneå°çšã¢ããªã®å Žåã¯iPadã®ããã ãã«UIScrollViewã«ãããšããã®ãèããã®ã§ãã
å¯Ÿå¿æ¹æ³
ãšãããå®ã¯ã iOS 12ããiPadã§iPhoneçšã¢ããªã衚瀺ãããš16:9ã®æ¯çã§è¡šç€ºããŠãããããã«ãªã£ãŠãã(ããã)ã§ãã4
Appleå
¬åŒã®æ
å ±ãèŠåœãããªãã®ãšå®æ©ãæã£ãŠããªãã®ã§æå®ããŠããŸããããã·ãã¥ã¬ãŒã¿ãŒäžã§ã¯ç¢ºãã«ãããªã£ãŠããããšãåãããŸãã
iOS 11.4ãš12.1ã®iPad Airã§ã®æ¯èŒã§ãã
| 1xã¢ãŒã | 2xã¢ãŒã |
|---|---|
![]() |
![]() |
ãããã£ãŠ(iOS 12æªæºã®iPadãŠãŒã¶ãŒãç¡èŠã§ããã°) ãããã4:3æ¯çã®ããã€ã¹å¯Ÿå¿ããéæŸãããã¯ãã§ãã
èªåã¯ãã®äºå®ç¥ããªãã£ãã®ã§ãå±ãããã©ã°ãæŸçœ®ãç¶ãããšããã§ããã
iPhoneå°çšã¢ããªã§ããã°ãä»åŸã¯ã¢ã¹ãã¯ãæ¯16:9ãããŒã¹ã«èããæå°ãµã€ãºã®ç«¯æ«ãiPhone SEãšèããŠç»é¢ã¬ã€ã¢ãŠããçµãã®ãè¯ãã®ããªãšæããŸããã
5. å šç»é¢ã§è¡šç€ºããç»åãå¿ èŠã ãã
æŠèŠ
ãªãããã®äºæ
ã«ããããã«ã¹ã¯ãªãŒã³ã®åŒã䌞ã°ãäžå¯èœãªç»åã䜿çšããå Žåã«ãç»åãªãœãŒã¹ã®åãæ¿ãã§ããã€ã¹å€å®ãããããšããããŸãã
äŸãã°Poiboyã ãš
- ãã°ã€ã³ã®ç»é¢ãªã©ã§äœ¿ãèæ¯ç»å
- äžéšã®ç»é¢ã®ãã¥ãŒããªã¢ã«çšç»å
ããã«ã¹ã¯ãªãŒã³è¡šç€ºãããŠããŸããã
1ã«ã€ããŠã¯ããèæ¯ç»åãå
±éã§çšæããŠé
眮ã§ã©ãã«ãããã°è¯ãã®ã§ã¯
ããšæãæ¹ããããããããŸããã
ãããç»åã®æ§è³ªäžã瞊é·ã«åãåããããšã©ãããŠãç»é¢ç«¯ã«ããã¢ãã«ããã®é¡ãåãããããŠãããã¯ãçã«è¯ããšã¯èšããªãèŠãç®ã«ãªã£ãŠããŸããŸãã
ãã®ããé«ã¢ã¹ãã¯ãæ¯ã®ç»åãå¥ã§çšæããããžãã¯ã§ã¹ã€ããããç®æããããšããããã§ãã
ç»åæ¯èŒããããšãæ¯çã«ãã£ãŠã¢ãã«ããã®åãèŸŒã¿æ¹ãç°ãªãã®ãèŠãŠåããŸãã
16:9ã§ã¯ã»ãŒå
šèº«ãå
¥ã£ãŠããã®ã«å¯ŸããŠã2:1ã«ãªããšè©ã®ããããŸã§ãã«ãããããŠããŸããŸãã
| iPhone 8 Plus (çžŠæšªæ¯ 16:9) | iPhone X (çžŠæšªæ¯ 2:1) |
|---|---|
![]() |
![]() |
ãŸã2ã«ã€ããŠããã¢ããªå ã§ãã¥ãŒããªã¢ã«ã宿œããéãæ¡ä»¶ãæã£ãŠããªããã®ã®èª¬æã ãã¯ããŠãããããããå šç»é¢ç»åã§ç¶æ ãåçŸã説æããŠããç®æããããåœç¶æ¯çãç¶æããªããšãããªããã®ã§ãããã§ãç»åãã¹ã€ããããå¿ èŠãçããŠããããã§ãã
å¯Ÿå¿æ¹é
æãé£ããã£ãã®ã¯ããã§ããã
ããã¯ãã 仿§ã®èª¿æŽãå«ããŠã®å¯Ÿå¿ãå¿
èŠã§ã
(ã©ããªéçºã§ã仿§èª¿æŽã¯é¿ããŠã¯éããŸãã
)
ããããããããã€ã¹å€å®ã¯ç¡ãããªããããããŸããããããŸãããã°æ¶ãããšãã§ãããããããŸããã
äŸãã°1ã§ããã°ãèæ¯ãšæåã®èŠçŽ (ã¢ãã«ãããšã)ãåããŠããã€èæ¯ãåŒã䌞ã°ãå¯èœãªèŠçŽ ã«ããã°çæ³çãªå¯Ÿå¿ãå¯èœã§ãã
èŠã¯éåžžã®ç»é¢ã®ããã«ã ã³ã³ãã³ããšããŠè¡šç€ºããç»åãAuto Layoutã§é
眮ãããããšã§è¯ãæãã«ã¹ã±ãŒã«ããããšããããšã§ãã
ã§ãããåœç¶ã¯ãªãšã€ãã£ããäœãåŽãšã®èª¿æŽãå¿
èŠã«ã¯ãªããŸãã
Poiboyã®ãã°ã€ã³ç»é¢ãèŠãŠããããšåããããã«ã ã¯ããããŒæ®åœ±ãããŠããããã§ã¯ãªãã®ã§ãããããèæ¯ãåé¢ããã®ã¯ç¡ç or ãã¡ããã¡ãé¢åã§ãã
ãããŸã§ããŠããã€ã¹å€å®ããžãã¯ããªããã¹ããã©ããã¯ãã話ãåã£ãŠèããŸãããã
2ã®ã±ãŒã¹ãããã¥ãŒããªã¢ã«ã®ä»æ§èªäœãèãçŽãã®ãå
決ã§ãã
ã¢ããªã®ç¶æ
管çã®èšèšèªäœãèŠçŽãããšãå¿
èŠã§ãããé床ã«è€éãªä»æ§ã¯ãšã³ãžãã¢åŽããé¿ããã¹ããšã®ææ¡ããã¹ãã ãšæããŸã ![]()
ããŸã
ãªããä»ããã«ããã€ã¹å€å®ã¯æ¶ããªããã©ããã以äžã®äœ¿çšã¯ãããã
ããšããå Žåã«ã¯ã@available ã¢ãããŒã·ã§ã³ãã€ããŠããããšã§äœ¿çšæã«warningsã衚瀺ãããããšãã§ããŸã ![]()
èªåã ãã§ã¯ãªãããŒã ã¡ã³ããŒãžã®åšç¥ã«ããªãã®ã§ãäžæ¬¡å¯Ÿå¿ãšããŠã¯ããããã®æ¹æ³ã§ã ![]()
ãŸãšã
ãšããããšã§ãä»åã¯Poiboy iOSã«ãããããã€ã¹å€å®ããžãã¯ã®äœ¿çšç®æãšèæ¯ã«ã€ããŠãŸãšããŸããã
å®éã«ã¯ã©ã³ãã¹ã±ãŒãã¢ãŒãããŠãããŒãµã«ã¢ããªã«é察å¿ãšããåæããã£ãã®ã§ã察å¿ãã¹ãç®æã¯æãã»ã©å€ãã¯ãããŸããã§ããã
ããä»ã«ãããããããšããã§ããã€ã¹å€å®ããŠããŠæ¶ããªãã£ã
ãçãªãã®ãããã°ããã²å
±æããŠããã ãããšå¬ããã§ãã
ãããŠææ¥ã¯ @cfiken ããã«ããæ©æ¢°åŠç¿ã«ãŸã€ãããã¹ãã§ã ![]()
æãããŠã©ããªå
容ã«ãªãã®ã§ãããã...
ä¹ããæåŸ
ã§ã ![]()











