You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
CollectionView를 활용한 카드뷰 효과_xib로 셀 커스텀하기-pagingViewContorller사용기
CollectionView의 FlowLayout과 ScrollView를 활용해 애니메이션 및 효과주기
FlowLayOut과 Cell을 커스텀하는데, FlowLayOut의 Cell영역 Estimate Size를 꼭 None으로 해야 정상적으로 셀과 컬렉션뷰가 보여짐 (이 부분때문에 맞게 코딩해놓고도 제대로 셀이나 컬렉션뷰가 보여지지 않는경우가 많다!! 매우중요!!)
viewDidLoad(){letcellWidth=CGFloat(324)letcellHeight=CGFloat(554)
// 상하, 좌우 inset value 설정
letinsetX=(pagingCollectionView.bounds.width - cellWidth)/ 2.0
letinsetY=(pagingCollectionView.bounds.height - cellHeight)/ 2.0
letlayout= pagingCollectionView.collectionViewLayout as!UICollectionViewFlowLayout
layout.itemSize =CGSize(width: cellWidth, height: cellHeight)
layout.minimumLineSpacing =15
layout.scrollDirection =.horizontal
pagingCollectionView.contentInset =UIEdgeInsets(top: insetY, left: insetX, bottom: insetY, right: insetX)
pagingCollectionView.delegate =self
pagingCollectionView.dataSource =self
// 스크롤 시 빠르게 감속 되도록 설정
pagingCollectionView.decelerationRate =UIScrollView.DecelerationRate.fast
}
커스텀할 셀의 크기를 설정해주고
상하좌우 인셋을 설정해 뷰가 가옴데에 맞게, 또한 옆과 오른쪽 셀의 Spacing (간격) 설정
스크롤 방향은 가로이므로 .horizontal
decelerationRate의 Rate.fast를 설정해 감속이 빠르게 되도록(스크롤이 자연스럽고 빠르게) 설정
extensionViewController:UIScrollViewDelegate{func scrollViewWillEndDragging(_ scrollView:UIScrollView, withVelocity velocity:CGPoint, targetContentOffset:UnsafeMutablePointer<CGPoint>){
// item의 사이즈와 item 간의 간격 사이즈를 구해서 하나의 item 크기로 설정.
letlayout=self.pagingCollectionView.collectionViewLayout as!UICollectionViewFlowLayoutletcellWidthIncludingSpacing= layout.itemSize.width + layout.minimumLineSpacing
// targetContentOff을 이용하여 x좌표가 얼마나 이동했는지 확인
// 이동한 x좌표 값과 item의 크기를 비교하여 몇 페이징이 될 것인지 값 설정
varoffset= targetContentOffset.pointee
letindex=(offset.x + scrollView.contentInset.left)/ cellWidthIncludingSpacing
varroundedIndex=round(index)
// scrollView, targetContentOffset의 좌표 값으로 스크롤 방향을 알 수 있다.
// index를 반올림하여 사용하면 item의 절반 사이즈만큼 스크롤을 해야 페이징이 된다.
// 스크롤 방향을 체크하여 올림,내림을 사용하면 좀 더 자연스러운 페이징 효과를 낼 수 있다.
if scrollView.contentOffset.x > targetContentOffset.pointee.x {
roundedIndex =floor(index)}else{
roundedIndex =ceil(index)}
// 위 코드를 통해 페이징 될 좌표값을 targetContentOffset에 대입하면 된다.
offset =CGPoint(x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y:-scrollView.contentInset.top)
targetContentOffset.pointee = offset
}}
item(cell)의 사이즈 간겨과 item의 간격을 포함해 하나의 크기로 설정
item의 x좌표를 targetContentOffset을 이용해 x좌표를 계산 후
절반사이즈를 계산해 item의 절반사이즈일때 스크롤 효과를 준다, 이때 올림 내림 연산을 이용해 연산을 자연스럽게 해주면 사용자의 페이징 효과도 자연스러워 진다.
셀에 관련된 그림자나, cornerRadius 등의 값은 뷰컨트롤러의 cell부분에서도 처리할 수 있지만 이왕이면 셀의 Class안에서 override func layoutSubviews( )을 이용해서 Cell에 관련된 부분의 초기설정을 해주는 것이 좋다. 보기에도 편하지만 이 셀의 초기화되는 xib부분에서의 처리가 logic상에서도 더 맞고, 관련 부분을 찾을때 프로젝트가 커지면 더욱이 찾기 어렵기에 해당셀에 관련된 내용은 해당 클래스에 맞도록 코딩!
loadViewFromNib( ) -> UIView 함수를 만들어 편리하고 유기적으로 nib파일을 붙일수 있도록 코딩