Swift/기타
[SWIFT]NotificationCenter 사용
삽질중
2023. 4. 24. 13:48
NotificationCenter 키보드 보이기,숨기기 / 백그라운드,포그라운드 / 사용자 Notification
/////////////////////////////////////////////////
// NotificationCenter 키보드 Noti 등록
// 키보드 보이기
NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillShow(noti: )) , name: UIResponder.keyboardWillShowNotification, object: nil)
// 키보드 숨기기
NotificationCenter.default.addObserver( self, selector: #selector(keyboardWillHide(noti: )) , name: UIResponder.keyboardWillHideNotification, object: nil)
// NotificationCenter 삭제
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification , object: nil)
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification , object: nil)
@objc func keyboardWillShow(noti: NSNotification) {
//키보드의 높이를 가져오는 코드
let notiInfo = noti.userInfo! as NSDictionary
let keyboardFrame = notiInfo[UIResponder.keyboardFrameEndUserInfoKey] as! CGRect
let height = keyboardFrame.size.height
self.bottomConstraint.constant = height
//애니메이션 추가 (View가 먼저 올라가서 키보드 올라오는 공백이 순간적으로 보이는 문제로 추가)
let animationDuration = notiInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
UIView.animate(withDuration: animationDuration, animations: { [weak self] in
self?.view.layoutIfNeeded()
}) { (Bool) in
}
}
@objc func keyboardWillHide(noti: NSNotification) {
let notiInfo = noti.userInfo! as NSDictionary
self.bottomConstraint.constant = 0
let animationDuration = notiInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
UIView.animate(withDuration: animationDuration, animations: { [weak self] in
self?.view.layoutIfNeeded()
}) { (Bool) in
}
}
/////////////////////////////////////////////////
// NotificationCenter 백그라운드 및 포그라운드 Noti 등록
// 포그라운드
NotificationCenter.default.addObserver(self, selector: #selector(onDidBecomeActive(not:)), name: UIApplication.didBecomeActiveNotification, object: nil)
// 백그라운드
NotificationCenter.default.addObserver(self, selector: #selector(onDidEnterBackgroundActive(not:)), name: UIApplication.didEnterBackgroundNotification, object: nil)
// NotificationCenter 삭제
NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
NotificationCenter.default.removeObserver(self, name: UIApplication.didEnterBackgroundNotification, object: nil)
@objc func onDidBecomeActive(not: Notification) {
...... 이하 생략 ......
}
사용자 NotificationCenter
//////////////////////////////////////////////////
// NotificationCenter User Noti 등록
NotificationCenter.default.addObserver(self, selector: #selector(UserCustomReceived(noti:)), name: NSNotification.Name(rawValue: "UserCustomNotification"), object: nil)
// NotificationCenter 삭제
NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "UserCustomNotification"), object: nil)
// NotificationCenter User 데이터 전송
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "UserCustomNotification"), object: (self?.view.frame.height, height), userInfo: nil)
@objc func UserCustomReceived(noti: Notification){
let height:(viewHeight: CGFloat, playerHeight: CGFloat) = noti.object as! (CGFloat, CGFloat)
}