Slide 1

Slide 1 text

6*-BZPVU(VJEFΛ׆༻͢Δ 4XJGUѪ޷ձWPM

Slide 2

Slide 2 text

OPQQF ! σΟʔɾΤψɾΤʔ " ϥΠϒ഑৴J04ΞϓϦ # ͖ͭͶ͔Θ͍͍

Slide 3

Slide 3 text

6*-BZPVU(VJEF w "VUPMBZPVUͷػೳΛ࣋ͬͨදࣔ͞Εͳ͍ϏϡʔͷΑ ͏ͳ΋ͷ w "ODIPS͔࣋ͨ͠ͳ͍γϯϓϧͳΫϥε w J1IPOF9Ͱ͸ϘλϯɾϊονΛআ͘ηʔϑΤϦΞΛ -BZPVU(VJEFͰ࣮૷͍ͯ͠Δ

Slide 4

Slide 4 text

6*-BZPVU(VJEF ྫɿWJFXTBGF"SFB-BZPVU(VJEF IUUQTRJJUBDPNHFOUMFKLPWJUFNTBEC

Slide 5

Slide 5 text

dJ04 w എܠ৭ΛDMFBSʹͨ͠ϏϡʔΛ഑ஔͯ͠ɺͦΕʹର͠ ੍ͯ໿Λ͔͚͍ͯͨɻ

Slide 6

Slide 6 text

6*-BZPVU(VJEF 6*7JFX 6*-BZPVU(VJEF "VUPMBZPVU ˓ ˓ ϨϯμϦϯάίετ º ˓ ػೳͷγϯϓϧ͞ ϨΠΞ΢τʹෆཁͳػೳ ͕ଘࡏ ࠷௿ݶ ϏϡʔώΤϥϧΩͷߋ৽ ͞ΕΔ ͞Εͳ͍

Slide 7

Slide 7 text

ࣗ࡞ͷ6*-BZPVU(VJEFΛੜ΍͢

Slide 8

Slide 8 text

ࣗ࡞ͷ6*-BZPVU(VJEFΛੜ΍͢ w TBGB"SFB-BZPVU(VJEFͳͲσϑΥϧτ࣮૷΋͋Γ w 6*-BZPVU(VJEF͸ࣗ෼Ͱ௥Ճ͢Δ͜ͱ΋Մೳ

Slide 9

Slide 9 text

GSFTI04,FZCPBSE-BZPVU(VJEF ΩʔϘʔυͷҐஔʹ-BZPVU(VJEFΛੜ΍͢&YUFOTJPO

Slide 10

Slide 10 text

Slide 11

Slide 11 text

OPQQFGPYXPMG5FYU$POUBJOFS-BZPVU(VJEF UFYU$POUBJOFSʹ-BZPVU(VJEFΛੜ΍͢&YUFOTJPO

Slide 12

Slide 12 text

OPQQFGPYXPMG5FYU$POUBJOFS-BZPVU(VJEF

Slide 13

Slide 13 text

ࣗ࡞ͷ6*-BZPVU(VJEFΛੜ΍͢ϝϦοτ w ෳࡶͳ੍໿ͷมԽΛ7$͔ΒӅṭग़དྷΔ w .BOVBM-BZPVU͕ͪ͠ͳՕॴΛݮΒͤΔ

Slide 14

Slide 14 text

ෳࡶͳ੍໿ͷมԽΛӅṭग़དྷΔ let nc = NotificationCenter.default nc.addObserver(self, selector: #selector(keyboardWillChangeFrame(_:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) ~~ NotificationCenter.default.removeObserver(self) ~~ viewBottomConstraint.constant = height view.layoutIfNeeded()

Slide 15

Slide 15 text

ෳࡶͳ੍໿ͷมԽΛӅṭग़དྷΔ button.bottomAnchor.constraint(equalTo: view.keyboardLayoutGuide.topAnchor).isActive = true

Slide 16

Slide 16 text

੩తɾ൒ಈతͳϨΠΞ΢τ ˠ4UPSZCPBSE 9*# ಈతɾϓϩάϥϚϒϧͳϨΠΞ΢τ ˠ6*-BZPVU(VJEF

Slide 17

Slide 17 text

-BZPVU(VJEF։ൃνϡʔτϦΞϧ

Slide 18

Slide 18 text

ྫɿ/PUDI-BZPVU(VJEF w /PUDIͷ৔ॴʹ-BZPVU(VJEFΛ഑ஔ͢Δ w ͭOPQQFGPYXPMG/PUDI-BZPVU(VJEF

Slide 19

Slide 19 text

Slide 20

Slide 20 text

ྲྀΕ w 6*-BZPVU(VJEFͷαϒΫϥεΛ࡞Δ w 6*8JOEPXʹࠇຐज़ͰMBZPVU(VJEFΛੜ΍͢ w ճసʹΑ੍ͬͯ໿Λߋ৽͢Δ

Slide 21

Slide 21 text

6*-BZPVU(VJEFͷαϒΫϥεΛ࡞Δ public class NotchLayoutGuide: UILayoutGuide { internal func setup() { guard let window = owningView else { return } NSLayoutConstraint.activate([ topAnchor.constraint(equalTo: window.topAnchor), centerXAnchor.constraint(equalTo: window.centerXAnchor), widthAnchor.constraint(equalToConstant: 230), heightAnchor.constraint(equalToConstant: 30), ]) } } ˞/PUDIͷαΠζ͸Y͘Β͍

Slide 22

Slide 22 text

6*8JOEPXʹMBZPVU(VJEFΛੜ΍͢ public extension UIWindow { public var notchLayoutGuide: NotchLayoutGuide { if let obj = objc_getAssociatedObject(self, &AssociatedKeys.notchLayoutGuide) as? NotchLayoutGuide { return obj } let new = NotchLayoutGuide() addLayoutGuide(new) new.setup() objc_setAssociatedObject(self, &AssociatedKeys.notchLayoutGuide, new as Any, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) return new } } FYUFOTJPOʹTUPSFEQSPQFSUZΛੜ΍͢ࠇຐज़Λ࢖͏ͱศར

Slide 23

Slide 23 text

ಈ࡞ͷ֬ೝ let button = UIButton(frame: .zero) button.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button) NSLayoutConstraint.activate([ button.topAnchor.constraint(equalTo: window.notchLayoutGuide.bottomAnchor), button.centerXAnchor.constraint(equalTo: window.notchLayoutGuide.centerXAnchor), button.widthAnchor.constraint(equalToConstant: 100), button.heightAnchor.constraint(equalToConstant: 44), ]) ϘλϯΛ/PUDI-BZPVU(VJEFͷԼʹ഑ஔ͢Δ੍໿Λͭ ͚Δ

Slide 24

Slide 24 text

Slide 25

Slide 25 text

Slide 26

Slide 26 text

ճసʹΑ੍ͬͯ໿Λߋ৽͢Δ NotificationCenter.default.addObserver(self, selector: #selector(didRotate), name: .UIDeviceOrientationDidChange, object: nil) ~~ deinit { NotificationCenter.default.removeObserver(self) }

Slide 27

Slide 27 text

ճసʹΑ੍ͬͯ໿Λߋ৽͢Δ private func update() { guard let window = owningView else { return } allConstraint.isActive = false //extension switch UIDevice.current.orientation { case .portrait: ... case .landscapeLeft: ... .....

Slide 28

Slide 28 text

Slide 29

Slide 29 text

Slide 30

Slide 30 text

6*-BZPVU(VJEFͰग़དྷͳ͍ࣄ w ୹ܗྖҬͰͳ͍΋ͷ͸ੜ΍ͤͳ͍ w ճసʹऑ͍ w %FCVH7JFX)JFSBMDZͰݟ͑ͳ͍ w ࣗ࡞-BZPVU(VJEF͸4UPSZCPBSE͔Β੍໿෇͚Ͱ͖ͳ ͍

Slide 31

Slide 31 text

·ͱΊ w -BZPVU(VJEF͸ࣗ࡞Ͱ͖Δ w ૿΍ͯ͠΋ϨϯμϦϯάίετ͸ͳ͍ w ෳࡶͳಈతॲཧ΋7$͔Β੾Γ཭ͤΔ

Slide 32

Slide 32 text

͋Γ͕ͱ͏͍͟͝·ͨ͠