화면 이동 후 화면 회전 시 원본 화면의 레이아웃 조정

9144 단어 SwiftiOS

안녕히 계십시오.


화면이 종횡으로 회전할 때, Notification을 사용하면 회전할 때 몇 가지 일을 처리할 수 있다.
Notification

// NotificationCenterに画面回転を追加
private func registerNotification() {   
    NotificationCenter.default.addObserver(self,
                                           selector:#selector(didChangeOrientation(_:)),
                                           name: .UIDeviceOrientationDidChange, 
                                           object: nil)

}

@objc private func didChangeOrientation(_ notification: Notification) {
    //画面回転のイベント
}

사용 예


예를 들어, UICollectionView를 가로세로와 무관하게 10*4에 40개의 레이아웃을 표시하는 경우

// UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.width/10, height: collectionView.frame.height/4)
}

// Notification
@objc private func didChangeOrientation(_ notification: Notification) {
    //画面回転のイベント
    collectionView.reloadData()
}

이런 느낌이야.🐸

화면 이동 상황


이번 화면 이동 후 화면을 돌리면 아까 사용한 예와 같은 배치가 이상해진다.

괜찮은 타입.


먼저, 방금 사용한 사례의 상태에서 화면이 이동한 후에 이동 후 화면에서 화면의 회전을 하고 화면을 닫는다.

변환 소스(수직) - 변환 후(수평)
변환 소스(수평) - 변환 후(수직)
의 두 모드 모두 CollectionView를 다시 불러와 크기를 조절합니다.

안 되는 패턴.


다음에는 아래처럼 테두리를 달아보세요.

대원 UIView에서 구성된 UICollectionView를 검은색 테두리 색상의 UIView가 있는 SubView로 구성하여 위아래 좌우로 10pt를 제한합니다.

UICollectionView의 셀 크기는 변환 전 화면의 방향에 따라 업데이트되지 않습니다.

시도해 본 일


1.layoutIfNeeded


우선 화면이 숨겨졌을 때 노티파이션 처리도 수행되기 때문에 화면이 숨겨졌을 때 대원의 뷰 프레임은 크기에 변화가 없었기 때문에 단원의 사이즈에 변화가 없었는지 의심스럽다.
@objc private func didChangeOrientation(_ notification: Notification) {
    print("frame:\(view.frame)")
    collectionView.reloadData()
}
그래서 나는 화면이 바뀐 후 View의 크기가 바뀔 때부터 변하지 않았다는 것을 알아차렸다.

즉, 레이아웃 IfNeedd를 통해 정확한 View 사이즈로 업데이트할 수 있다는 것이 더 좋지 않습니까?그렇게 생각했어.
@objc private func didChangeOrientation(_ notification: Notification) {
    view.layoutIfNeeded()
    collectionView.reloadData()
}


2.viewDidAppear/viewDidLayoutSubviews


"UIView oricon frame not change"를 찾아보니 view Did Apper와view Did Layout Subviews가 프레임을 업데이트한다고 해서 거기에 업데이트된 내용을 썼어요."아니, 이번 패턴이면 한순간에 안 되는 사람 지면이 디자인이 안 되나? 그래도 한번 해볼까?"


아니오, 알고 있습니다.

3. View 수동 업데이트


대원의 UIView 치수는 수동으로 UIScreen 치수로 업데이트됩니다.
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    view.frame.size = UIScreen.main.bounds.size
    view.layoutIfNeeded()
}


끝맺다
추기

좋은 웹페이지 즐겨찾기