рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреАрдбрд╝реЗ

рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рд╕рдВрджреЗрд╢ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХреАрдмреЛрд░реНрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрджреЗрд╢ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рдХреАрдмреЛрд░реНрдб рд╡рд╣рд╛рдБ рд╣реИ, рдЬрд╣рд╛рдВ рдкрд╛рда рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ? рдХреАрдбрд╝реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреА рд╕рд╛рдорд╛рдиреНрдп рдХрдорд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

Mail.ru рдХреЗ рдПрдХ iOS рдбреЗрд╡рд▓рдкрд░, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди рдореЛрд░реНрдбрди рдиреЗ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рджреЗрдЦрд╛: iOS рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЦреНрдп рдмрдЧ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред



рд╕рд╛рд╡рдзрд╛рдиреА: рдХрдЯреМрддреА рдХреЗ рддрд╣рдд, рд╣рдо рдХреАрдбрд╝реЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЬрд┐рдлрд╝ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдПрдкреНрд╕рдХреЙрдиреНрдл рдкрд░ рдХреЛрдВрд╕реНрдЯреЗрдВрдЯрд┐рди рдХреА рд╡реАрдбрд┐рдпреЛ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЖрдкрдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓реЗрдВрдЧреЗред

рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛


рдЖрдЗрдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреАрдмреЛрд░реНрдб рдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдпрд╣ рд╕рдордЭрдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВред

рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдРрд╕рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░реНрдп рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдХрдирд╛рдбрд╛рдИ (рдПрдХ рджрдХреНрд╖рд┐рдг рдкрд╛рд░реНрдХ рдЪрд░рд┐рддреНрд░) рдХреЛ рдкреВрд░реЗ рдХрдирд╛рдбрд╛рдИ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИред рдЬрдм рдЖрдк рдРрдХреВ рдХреЛ рдкреЗрдЯ рдкрд░ рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреАрдмреЛрд░реНрдб рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдорд╛рд░реЗ рдирд╛рдпрдХ рдХреЗ рдкреИрд░ рд╕рд┐рд░ рдХреА рдУрд░ рдЙрда рдЬрд╛рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк InputAccessoryView рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

InputAccessoryView


рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

ViewController рдореЗрдВ, рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ рдЬреЛ рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рдЙрдареЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдПрдХ рдлреНрд░реЗрдо рджреЗрдЧрд╛ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рд╕рдмрд╡реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рд╣рдо canBecomeFirstResponder рдЧреБрдг рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рд╣рдо UIResponder рдЧреБрдг - inputAccessoryView рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╡реНрдпреВ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдХреАрдмреЛрд░реНрдб рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреИрдкрдЧреНрд░реЗрдЪрд░ рдФрд░ рдЙрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рд╣рдордиреЗ рдЬреЛ рд╡реНрдпреВ рдмрдирд╛рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╣рд▓реЗ рд░реАрд╕реНрдкреЛрдВрдбрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ ред

class ViewController: UIViewController { var tummyView: UIView { let frame = CGRect(x: x, y: y, width: width, height: height) let v = TummyView(frame: frame) return v } override var canBecomeFirstResponder: Bool { return true } override var input AccessoryView: UIView? { return tummyView } func tapHandler ( ) { tummyView.resignFirstResponder ( ) } } 

рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рдХреАрдмреЛрд░реНрдб рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рджреГрд╢реНрдп рдЙрдард╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред



рд╕рд┐рд╕реНрдЯрдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдореВрд╣реЛрдВ рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдЬрдм рдХреАрдмреЛрд░реНрдб рд╣реЛрдЧрд╛ / рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: keyboardWillShowNotification, keyboardDidShowNotification;
  • рдЬрдм рдХреАрдмреЛрд░реНрдб рд╣реЛрдЧрд╛ / рдЫрд┐рдкрд╛ рд╣реБрдЖ рдерд╛: keyboardWillHideNotification, keyboardDidHideNotification;
  • рдЬрдм рдХреАрдмреЛрд░реНрдб рдлреНрд░реЗрдо рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ / рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: KeyboardWilChangeFrameNotification, keyboardDidChangeFrameNotificationред

рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХреАрдмреЛрд░реНрдбрд╡реИрд▓рдЪреЗрдВрдЬрдлреНрд░реЗрдордирд╛рдореЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рд▓реЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рджреЛрдиреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреАрдмреЛрд░реНрдб рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рдЫрд┐рдкрд╛ рд╣реЛрддрд╛ рд╣реИред

рд╣рдо рдПрдХ KeyboardTracker рдмрдирд╛рддреЗ рд╣реИрдВ , рдЗрд╕рдореЗрдВ рд╣рдо рдПрдХ KeyboardWillChangeFrame рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдлрд╝реНрд░реЗрдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╡рд┐рдВрдбреЛ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ, рдХреАрдмреЛрд░реНрдб рдХреА рдКрдБрдЪрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдХреАрдмреЛрд░реНрдб рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпреВ рдХрд╛ рдорд╛рди рдмрджрд▓рдХрд░ рдЗрд╕ рдКрдБрдЪрд╛рдИ рдкрд░ рджреЗрдЦреЗрдВред

 class KeyboardTracker { func enable ( ) { notificationCenter.add0observer(self, seletor: #selector( keyboardWillChangeFrame), name: UIResponder.keyboardWillChangeFrameNotification, object: nil) } func keyboardWillChangeFrame ( notification: NSNotification) { let screenCoordinatedKeyboardFrame = (userInfo [ UIResponder.keyboardFrameEndUserInfoKey ] as! NSValue ) .cgRectValue let keyboardFrame = window.convert ( screenCoordinatedKeyboardFrame, from: nil ) let windowHeight = window.frame.height let keyboardHeight = windowHeight - keyboardFrame.minY delegate.keyboardWillChange ( keyboardHeight ) } } 

рдЗрд╕ рдкрд░, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдХреАрдмреЛрд░реНрдб рдЙрдЧрддрд╛ рд╣реИ, рдХрдирд╛рдбрд╛ рдореЗрдВ рдЗрдХреЗ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдордиреЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛рдпрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдФрд░ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдВрдЧреЗред

рдХреАрдбрд╝реЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ


рдпрджрд┐ рдХреАрдмреЛрд░реНрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ, рддреЛ рдХреАрдбрд╝реЗ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВ? рдмреЗрд╢рдХ, рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓рдиреЗ рдФрд░ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рднреА, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреА рдЙрдирдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдмрдЪрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Ike рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓реЗрдВ, рдиреЛрдЯреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ, рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред



рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИрдВ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдРрдк рд╕реНрд╡рд┐рдЪрд░ рдореЗрдВ рдХреЛрдИ рдХреАрдмреЛрд░реНрдб рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрдм рдЖрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред рджреВрд╕рд░реЗ, рдЬрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддрдм рднреА рдХреАрдмреЛрд░реНрдб рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ Ike рдХреЗ рдкреИрд░ рдиреАрдЪреЗ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╕рднреА рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЬреАрд╡рдирдЪрдХреНрд░ рдЖрд░реЗрдЦ рд╕реЗ рдпрд╛рдж рд╣реИ, рдПрдХ рд╕рдХреНрд░рд┐рдп рд░рд╛рдЬреНрдп рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкрд╣рд▓реЗ рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рдФрд░ рдлрд┐рд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиред

рдХреАрдмреЛрд░реНрдб рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? IOS рдореЗрдВ, рд╕рдордп рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗрд╡рд▓ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдкрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреАрдмреЛрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдЙрди рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИрдВред

рдЬрдм рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЕрдкрдиреЗ рдлрд░реНрд╕реНрдЯResponder рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреАрдмреЛрд░реНрдб рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреЛ рдЧрд╛рдпрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдПрдХ KeyboardWillHide рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ KeyboardDidHideNotificationред рдЕрдзрд┐рд╕реВрдЪрдирд╛ рджреВрд╕рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░рддреА рд╣реИред рдирдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рд╣рдо рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓рддреЗ рд╣реИрдВ: рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрдмреЛрд░реНрдб рднреЗрдЬрддрд╛ рд╣реИред рддрдм рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЪрдХреНрд░ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреАрдмреЛрд░реНрдб-DIDShowNotification - рдПрдХ рдбреЗрдореЛ рднреЗрдЬрддрд╛ рд╣реИред



рдпрджрд┐ рдЖрдк рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдПрдХ рдЕрдВрд╢ (8:39 рд╕реЗ) рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╡рд╣ рдХреНрд╖рдг рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬрдм рдХреАрдмреЛрд░реНрдб рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдкрд╣рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрдмреЛрд░реНрдбрдбрд╛рдпрд╣рд╛рдЗрдбрдиреЗрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрддрд╛ рд╣реИред рдЬрдм рдЖрдк рдЦреЗрд▓ рдРрдк рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреАрдмреЛрд░реНрдб рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдбрд╡реНрд╣реАрд▓рд╢реВрдЯреЙрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдФрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреНрд╡рд░рд┐рдд рд╣реИ, рдФрд░ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХрд╛ рд╕рдордп рд▓рдВрдмрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рд╛рдкреНрдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рди рдХреЗрд╡рд▓ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧреА, рдмрд▓реНрдХрд┐ рдмреАрдпрд░ рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡реЗрджрди рдХрд░реЗрдЧреА, рдЬреЛ рдЕрднреА рддрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЬрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдИ рд╣реИред

рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдЕрдм рдЖрдЗрдХреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдЦреЛрдЬреЗрдВред

рдмреБрд░рд╛ рдирд┐рд░реНрдгрдп


рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ рд╣реИ рдХреАрдмреЛрд░реНрдб рд╕рдХреНрд╖рдо рдХрд░рдиреЗ / рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдиреНрдпреВрдирддрдо / рдЕрдзрд┐рдХрддрдо рдХрд░рдиреЗ рдкрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдЕрдирд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм / рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХрд╛ред

рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ApplicationWillResignActive рдореЗрдердб рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмреНрд╕реНрдХреНрд░рд╛рдЗрдмрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо applicationDidBecomeActive рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдпрд╛рдж рди рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо ApplicationWillEnterForeground рдореЗрдердб рдХреЛ рднреА рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдЧреНрд░рднреВрдорд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЬрдм рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреАрдмреЛрд░реНрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдлрд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓рдирд╛ рдФрд░ рд╡реЙрдпрд╕ рдбрд╛рдпрд▓рд┐рдВрдЧ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛, рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред



рдХреНрдпрд╛ рд╣реБрдЖ? рд╡реЙрдпрд╕ рдореИрд╕реЗрдЬ рдбрд╛рдпрд▓рд┐рдВрдЧ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд░реНрд╕реНрдЯResponder рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдпрд╛, рдХреАрдмреЛрд░реНрдб рдмрдВрдж рд╣реЛ рдЧрдпрд╛, ApplicationWillResignActive рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рд╣рдордиреЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреАред рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди ApplicationWillEnterForeground рд╡рд┐рдзрд┐ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ApplicationDidBecomeActive рд╕реЗ рдкрд╣рд▓реЗ, рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп


рдПрдХ рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдПрдХ рд╕реБрд░рдХреНрд╖рд╛рддреНрдордХ рд╢реЛрд░рдмрд╛ (рдмреВрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред

 var wasTummyViewFirstResponderBeforeApp0idEnterBackground func willResignActive( notification: NSNotification) { wasTextFieldFirstResponderBeforeAppDidEnterBackground = tummyView.isFirstResponder } func willEnterForeground ( notification: NSNotification) { if wasTextFieldFirstResponderBeforeAppDidEnterBackground { UIView.performWithourAnimation { tummyView.becomeFirstResponder ( ) } } } 

рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╖рдп рд╕реЗ рдкрд╣рд▓реЗ рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛, рдХреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рдирд╡рд┐рд▓реЗрдЯрд░рдлреЙрд░рдЧреНрд░рд╛рдЙрдВрдб рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рдХреНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдмрдЪреА рд╣реИ рдЬреЛ рдРрдк рд╕реНрд╡рд┐рдЪрд░ рдореЗрдВ рдЫреЗрдж рд╣реИред



рдРрдк рд╕реНрд╡рд┐рдЪрд░


рдРрдк рд╕реНрд╡рд┐рдЪрд░ рдРрдк рд╕реНрдиреИрдкрд╢реЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдРрдк рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд┐рд╕реНрдЯрдо рдХрд░рддрд╛ рд╣реИред рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдЙрд╕ рд╕рдордп рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдХреАрдмреЛрд░реНрдб рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдХреБрдЫ рд╣реА рдХреНрд▓рд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВред

рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди


рд╕рдорд╛рдзрд╛рди рдХреЛ рдЙрди рдмреИрдВрдХрд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рд╕реАрдЦрд╛ рд╣реИ, рдФрд░ Apple рд╕реЗ рднреА рдкрдврд╝рд╛ рд╣реИред

рдЖрдк ApplicationDidEnterBackground рд╡рд┐рдзрд┐ рдореЗрдВ рдбреЗрдЯрд╛ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд▓рдВрдХ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ ApplicationWillEnterForeground рд╡рд┐рдзрд┐ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ ApplicationDidEnterBackground рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп


рд╣рдо рдкрд░рд┐рдЪрд┐рдд рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ редResignActive, willEnterForeground рдФрд░ didBecomeActiveред

рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдХреАрдмреЛрд░реНрдб рд╣реИ, рдЖрдкрдХреЛ рд╡рд┐рд▓-рдЖрд░реНрдХрд┐рдЯреЗрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрдкрдирд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

 func willResignActive( notificaton: NSNotification) { let keyWindow = UIApplication.shared.keyWindow imageView = UIImageView( frame: keyWindow.bounds) imageView.image = snapshot ( ) let lastSubview = keyWindow.subviews.last lastSubview( imageView) } 

WillEnterForeground рдФрд░ didBecomeActive рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред

 func willEnterForeground( notification: NSNotification) { imageView.removeFromSuperview( ) } func didBecomeActive( notification: NSNotification) { imageView.removeFromSuperview( ) } 

рдирддреАрдЬрддрди, рд╣рдордиреЗ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛: рдРрдк рд╕реНрд╡рд┐рдЪрд░ рдореЗрдВ, рдПрдХ рд╕реБрдВрджрд░ рддрд╕реНрд╡реАрд░ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдХреАрдмреЛрд░реНрдб рдЕрдм рдирд╣реАрдВ рдХреВрджрддрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдРрд╕реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рдж рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдпреЗ рдмрд┐рдВрджреБ рдмреЗрд╣рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рдмреБрд░реА рдЦрдмрд░


Ike рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд╕рдлрд▓ рд╕рдорд╛рдзрд╛рди рдЙрд╕ рдорд╛рдорд▓реЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдЬрдм рдЖрд╡реЗрджрди рдХреЛ рдХрдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреАрдмреЛрд░реНрдб рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдХреАрдмреЛрд░реНрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╣реЛрддреА рд╣реИ, рддреЛ рдлрд┐рд░ рд╕реЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ Ike рдХреЗ рдкреИрд░ рдиреАрдЪреЗ рдЧрд┐рд░ рдЧрдПред



рдпрд╣ рди рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдлреЗрд╕рдмреБрдХ рдХреЗ рд▓рд┐рдП рднреА рдордирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ iMessage рдХреЗ рд▓рд┐рдП рднреА, рдЬреЛ рдХреАрдмреЛрд░реНрдб рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП inputAccessoryView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдХреАрдмреЛрд░реНрдб рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред

рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рдХреАрдмреЛрд░реНрдб рдмрд░реНрдЦрд╛рд╕реНрддрдЧреА


Ike рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХреАрдмреЛрд░реНрдб рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдПрдВред



рдмреБрд░рд╛ рдирд┐рд░реНрдгрдп


рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдХреАрдмреЛрд░реНрдб рджреГрд╢реНрдп рдХреЗ рдлреНрд░реЗрдо рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рд╣рдо panGestureRecognizer рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╣рдо рдХреАрдмреЛрд░реНрдб рдХреЗ рд▓рд┐рдП Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдирдП рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реА рдЙрдВрдЧрд▓реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХреАрдмреЛрд░реНрдб рджреГрд╢реНрдп рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд░рддреЗ рд╣реИрдВред

 func panGestureHandler( ) { let yPosition: CGFloat = value keyboardView( )?.frame.origin.y = yPosition } 

рдХреАрдмреЛрд░реНрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рд╕рд░рдгреА рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреАрдмреЛрд░реНрдб рд╡рд┐рдВрдбреЛ рд╣реИ рдФрд░ рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЗрд╕рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬреЛ рдХреАрдмреЛрд░реНрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИред

 func keyboardView( ) -> UIView? { let windows = UIApplication.shared.windows let view = windows.first { (window) -> Bool in return keyboardView( fromWindow: window) != nil } return view } 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ iPhone X рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдЖрдк рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЛ рд╣рд┐рд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдирд┐рдЪрд▓реЗ рд╕рдВрдХреЗрддрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдЫреВ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЫрд┐рдкрд╛рдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред



рд╕рдорд╕реНрдпрд╛ рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд░рдгреА рдореЗрдВ рд╣реИред



рдЗрд╢рд╛рд░реЗ рдХреЗ рдмрд╛рдж, рд╕рд┐рд╕реНрдЯрдо рдореМрдЬреВрджрд╛ рдПрдХ рдХреЗ рдКрдкрд░ рдПрдХ рдирдпрд╛ рдХреАрдмреЛрд░реНрдб рд╡рд┐рдВрдбреЛ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрдХрд▓реНрдкрдиреАрдп рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдЪ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рд╕рдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рджреЛ рдХреАрдмреЛрд░реНрдб рд╡рд┐рдВрдбреЛ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред



рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐, рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рд╕рд░рдгреА рдкрд░ рдЪрд▓рдиреЗ рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдЬреЛ рд╢рд░реНрддреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИред

рдпрд╣ рдХреИрд╕реЗ рддрдп рд╣реБрдЖ? рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдореЛрдбрд╝рдирд╛ред

 func panGeastureHandler( ) { let yPosition: CGFloat = 0.0 keyboardView( )?.frame.origin.y = yPosition } func keyboardView( ) -> UIView? { let windows = UIApplication.shared.windows.reversed( ) let view = windows.first { (window) -> Bool in return keyboardView( fromWindow: window) != nil } return view } 

IPad рдкрд░ рдХреАрдмреЛрд░реНрдб рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рдЖрдИрдкреИрдб рдкрд░ рдХреАрдмреЛрд░реНрдб, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрдирдбреЙрдХрдб рд╕реНрдЯреЗрдЯ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд▓рд╛рдЗрдб рдУрд╡рд░ рдореЛрдб (рджреВрд╕рд░реЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░) рдореЗрдВ рднреА рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрди рд╕рднреА рдореЛрдб рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдмрдЧ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╣рд╛рдпрдХреЗ рдкрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВред



рдХрд╛рд╢, рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреАрдмреЛрд░реНрдб рд▓реЗ рдЬрд╛рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЗрдХреЗ рдХреЗ рдкреИрд░ рдЙрд╕рдХреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдЙрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреАрдмреЛрд░реНрдб рдХреЗ рдЕрдЧрд▓реЗ рдЦреБрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдорд▓реЗ рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░рдгреЛрдВ


рдЪрд▓реЛ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдкреНрд▓рд┐рдЯ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рджреЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдЧреНрд░реБрдк рдорд┐рд▓рддреЗ рд╣реИрдВ - KeyboardWillChangeFrameNotification, KeyboardWillHideNotification, keyboardDidChangeFrameNotification, keyboardDidHideNotificationред рд╕рдореВрд╣реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдХреАрдмреЛрд░реНрдб рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рд╣реИред

рдЬрдм рд╣рдо рд╡рд┐рднрд╛рдЬрд┐рдд рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреАрдмреЛрд░реНрдб рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдореВрд╣ рдЖрддрд╛ рд╣реИред рдЬрдм рдХреАрдмреЛрд░реНрдб рдЕрд▓рдЧ рд╣реЛ рдЧрдпрд╛ рдФрд░ рдКрдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ - рд╣рдореЗрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рджреВрд╕рд░рд╛ рдкреИрдХреЗрдЯ рдорд┐рд▓рд╛ред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛред рдпрд╣, рд╡реИрд╕реЗ, KeyboardWillChangeFrameNotification рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдФрд░ рдкреНрд▓рд╕ рд╣реИред

рдХреНрдпреЛрдВ, рдЬреИрд╕реЗ рд╣реА рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреАрдмреЛрд░реНрдб рдХреЛ рд╣рд┐рд▓рд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрдХреЗ рдХреЗ рдкреИрд░ рдЙрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ?

рдЗрд╕ рд╕рдордп, рд╕рд┐рд╕реНрдЯрдо рд╣рдореЗрдВ рдПрдХ KeyboardWillChangeFrameNotification рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЬреЛ рд╡рд╣рд╛рдВ рдЭреВрда рдмреЛрд▓рддреЗ рд╣реИрдВ (0.0, 0.0, 0.0, 0.0), рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдВрджреЛрд▓рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХреАрдмреЛрд░реНрдб рдХрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк рдХреАрдмреЛрд░реНрдб рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдореЗрдВ рд╢реВрдиреНрдп рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдХреА рдКрдВрдЪрд╛рдИ рдЦрд┐рдбрд╝рдХреА рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ Ike рдХреЗ рдкреИрд░ рд╕реНрдХреНрд░реАрди рд╕реЗ рджреВрд░ рдЙрдбрд╝рддреЗ рд╣реИрдВред

рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп


рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рдпрд╣ рд╕рдордЭрдирд╛ рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдЕрдирдбреЙрдХ рдХрд┐рдП рдЧрдП рдореЛрдб рдореЗрдВ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд╡рд┐рдВрдбреЛ рдХреА рдКрдВрдЪрд╛рдИ рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреАрдмреЛрд░реНрдб рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреАрдмреЛрд░реНрдб, рдпрджрд┐ рдЕрдзрд┐рдХрддрдо рдЦрд┐рдбрд╝рдХреА рдХреА рдКрдВрдЪрд╛рдИ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреАрдмреЛрд░реНрдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреАрдмреЛрд░реНрдб рдХреЛрдбрд░ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

 class KeyboardTracker { func enable( ) { notificationCenter.addObserver( self, selector:#selector( keyboardWillChangeFrame), name:UIResponder.keyboardWillChangeFrameNotification, object:nil) } func keyboardWillChangeFrame( notification: NSNotification) { let screenCoordinatedKeyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue let leyboardFrame = window.convert ( screenCoordinatedKeyboardFrame, from: nil) let windowHeight = window.frame.height let keyboardHeight = windowHeight - keyboardFrame.minY let isKeyboardUnlocked = isIPad ( ) && keyboardFrame/maxY < windowHeight if isKeyboardUnlocked { keyboardHeight = 0.0 } delegate.keyboardWillChange ( keyboardHeight) } } 

рд╣рдо рдХрд╕реНрдЯрдо рдХреЛ рдКрдВрдЪрд╛рдИ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдХреАрдмреЛрд░реНрдб рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рд╕рд╛рде, рдЗрдХреЗ рдХреЗ рдкреИрд░ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рддрдп рд╣реЛрддреЗ рд╣реИрдВред



рдХреЗрд╡рд▓ рд╢реЗрд╖ рдЧрд▓рддрдлрд╣рдореА рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдХреАрдмреЛрд░реНрдб рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╕рдордп, Ike рдХреЗ рдкреИрд░ рддреБрд░рдВрдд рдиреАрдЪреЗ рдирд╣реАрдВ рдЧрд┐рд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░реЗрдВ?

рд╣рдо KeyboardTracker рдХреЛ KeyboardWillChangeFrameNotification рд╕реЗ рд╣реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ KeyboardDidChangeFrame рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдПрдВрдЧреЗред рдЖрдкрдХреЛ рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдХрд┐ рдпрд╣ рдПрдХ iPad рд╣реИ рддрд╛рдХрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрдгрдирд╛ рди рдХрд░реЗрдВред

 class KeyboardTracker { func keyboardDidChangeFrame( notification: NSNotification) { if isIPad ( ) == false { return } 




рдмрдЧ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВ?


рдкреНрд░рдЪреБрд░ рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рд▓реЙрдЧ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ: рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдФрд░ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо, рдЬрд┐рд╕рдореЗрдВ рд▓реЙрдЧ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рдлрд┐рд░ рд▓реЙрдЧ рдХрд╛ рдкрд╛рдаред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
[keyboard][tracker] keyboardWillChangeFrame: calculated height - 437.9

рдХреЛрдб рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ - рдПрдХ рд▓рдХрдбрд╝рд╣рд╛рд░рд╛ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЯреНрд░реИрдХрд░ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЯреНрд░реИрдХрд░ рдХреЗ рдЕрдВрджрд░, рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рдЯреИрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реЙрдЧрд░, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдХреНрд╖рд╛ рдХреЗ рдЕрдВрджрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

 class KeyboardTracker { init(with logger: Logger) { self.trackerLogger = logger.dequeue(withTag: "[tracker]") } func keyboardWillChangeFrame(notification: NSNotification) { let height = 0.0 trackerLogger.debug("\(#function): calculated height - \(height)") } } 

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреВрд░реЗ рдХреАрдмреЛрд░реНрдб рдХреЛ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛, рдЬреЛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЕрдЧрд░ рдкрд░реАрдХреНрд╖рдХреЛрдВ рдХреЛ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓реА, рддреЛ рдореИрдВрдиреЗ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд▓реА рдФрд░ рдареАрдХ рдЙрд╕реА рдЬрдЧрд╣ рдХреА рддрд▓рд╛рд╢ рдХреА рдЬрд╣рд╛рдВ рдлреНрд░реЗрдо рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛ред рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛, рдЗрд╕рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп рддрд░реАрдХреЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд▓рдЧреЗред

рдирд┐рдЧрд░рд╛рдиреА


рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЙрдЪрдбреЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджрд┐рдорд┐рддреНрд░реА рдХреБрд░реНрдХрд┐рди рдиреЗ рдкрд┐рдЫрд▓реЗ AppsConf рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдмрддрд╛рдпрд╛ рдерд╛ред

рд╡реЙрдЪрдбреЙрдЧ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдзрд╛рдЧрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛ рдереНрд░реЗрдб рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ ред рдпрд╣ рддрдВрддреНрд░ рдЖрдкрдХреЛ рдХреАрдмреЛрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдмрд╛рд░ рдПрдХ рд╕реЗрдХрдВрдб рдореЗрдВ рд╣реЗрдХ рдХреЗ рдкреИрд░реЛрдВ рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЗ рд╕рд╣реА рд╕реНрдерд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдпрд╛ рдпрджрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реИ рддреЛ рдЗрд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред

 class Watchdog { var timer: Timer? func start ( ) { timer = Timer ( timeInterval: 1.0, repeats: true, block: { ( timer ) in self.woof ( ) } ) } } 

рд╡реИрд╕реЗ, рдЖрдк рди рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд▓реЙрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░рдЪреБрд░ рд▓реЙрдЧрд┐рдВрдЧ + рд╡реЙрдЪрдбреЙрдЧ рдиреЗ рд╕рдорд╕реНрдпрд╛, рдХреАрдмреЛрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдЯреАрдХ рдбреЗрдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдХрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдмреАрдЯрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣рдирд╛ рдкрдбрд╝рд╛ред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╡реЙрдЪрдбреЙрдЧ рдХреЛ рди рдХреЗрд╡рд▓ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА?

рдЙрд╕ рдХреЛрдб рдореЗрдВ рдЬрд╣рд╛рдВ рд╡реЙрдЪрдбреЙрдЧ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрддрд╛ рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрднрд┐рд╕рд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо FixTummyPosition рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ, рдореЗрд░реЗ рд▓реЙрдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдЬрдорд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдХреАрдмреЛрд░реНрдб рдХреА рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рдкрд╛рдПрдЧрд╛ред

рдпрд╣ рд╡реЙрдЪрдбреЙрдЧ рдкрджреНрдзрддрд┐ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рдЯреЗрд╕реНрдЯ рдХреИрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдХреЛрдб рд░реАрдорд╛рдЙрдЯ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗ рддрд╣рдд рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм, рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рдж, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреНрд░реИрд╢ рдкреАрдврд╝реА рдХреЛ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреАрдмреЛрд░реНрдб рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рддреЛ рдЙрд╕рдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рд▓реЙрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдк рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбреИрд╢рдмреЛрд░реНрдб


рд╣рдордиреЗ рдЬреЛ рдЖрдЦрд┐рд░реА рдЯреНрд░рд┐рдХ рд╢реБрд░реВ рдХреА рд╣реИ, рд╡рд╣ рдЙрд╕ рд╕рдордп рдХреЗ рдЖрдВрдХрдбрд╝реЗ рднреЗрдЬ рд░рд╣реА рд╣реИ, рдЬрдм рд╡рд╛рд╣рдЯрдЪреЛрдЧ рдиреЗ рдЖрдВрдХрдбрд╝реЗ рджрд░реНрдЬ рдХрд┐рдПред рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд▓реЙрдЯ рдХрд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рдж, рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдЪрд╛рд░ рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдИред рдмреЗрд╢рдХ, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╢реВрдиреНрдп рддрдХ рдХрдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдореБрдЦреНрдп рд╢рд┐рдХрд╛рдпрддреЗрдВ рдмрдВрдж рд╣реЛ рдЧрдИрдВред

рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рд╕реЗрдВрдЯ рдПрдкреНрд╕рдХреЙрдиреНрдл рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рдореЗрдВ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ рдЖрдк рди рдХреЗрд╡рд▓ рдХреЛрдВрд╕реНрдЯреЗрдВрдЯрд┐рди рд╕реЗ рд╕рд╡рд╛рд▓ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЖрдИрдУрдПрд╕-рдЯреНрд░реИрдХ рдХреЗ рдХрдИ рд╡рдХреНрддрд╛рдУрдВ рд╕реЗ рднреА рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi462515/


All Articles