본문 바로가기
WWDC

WWDC 16 - What's New in UICollectionView in iOS 10

by vapor3965 2021. 6. 26.

목차


    • 세션보면서 정리한 내용입니다. 해석이 잘못된 경우가 있을수있으니 발견하시면 댓글로 남겨주시면 감사하겠습니다🙏🏻

     

    https://developer.apple.com/wwdc16/219

     

    What's New in UICollectionView in iOS 10 - WWDC16 - Videos - Apple Developer

    UICollectionView is a powerful class allowing your app to manage and customize the layout of views. iOS 10 brings enhancements for better...

    developer.apple.com


    요약

    • 스무스한 스크롤이되려면 초당 60프레임이 나와야한다. 
    • UICollectionView cell은 pre-fetching 스타일을 도입했다. ( 그러므로 더 스무스한 스크롤이가능해짐 ) 
    • UICollectionView,UITableView는 새로운 API, prefetchDataSource를 추가했다.
    • UICollectionView에서는 self-sizing Cell을 위해 UICollectionViewFlowLayoutAutomaticSize 를 추가했다.
    • 작년에 interactive한 reorder를 collectionView에 추가했는데, 올해는 reorder할때 paging 으로 가능하게했다
    • 또! 이제 ScrollView를 상속받는 뷰들은 UIRefreshController을 사용할수있다! 

     


     

     

    기본적으로 스무스한 스크롤링이되려면 초당 60프레임이 나와야한다. 

     

     

    우리가 다음셀을 가져오기위해서는,

    그전에  reuse queue에서 가져오고, 

    prepareForResuse 콜한다. 

    • default state로 reset하는 기회를 주고, 새로운 데이터를 받을준비를 한다. 

     

     

    그다음 CellForItemAtIndexpath를 호출한다. 

    여기서는 셀을 나타나도록 하고, 데이터모델을 엑세스하고, 셀에 셋하고, 시스템에 return하는역할을한다. 

     

     

    스크린에 셀이나타나기직전에 마지막작업을 할 기회를 갖는 willDisplayCell을 호출한다. 

     

    사라지려는 셀은 didEndDisplayingCell을 호출한다. 

     

     

     

     

    이제는...iOS X에서는??!!

     

     

     

     

    여기서차이점이있는데, 

    더이상 셀이생성되자마자 willDisplayCell을 호출하지않고,

    망설이다가, 보여질댸! willDisplayCell을 호출한다. 

     

    셀이안보여질때는 didEndDisplayingCell을 호출한다.

    여기서도 차이점이 있는데, 바로 reuse queue에 들어가기보다는, 

    조금더 기다린다. 

    왜냐하면 간혹 무심코올렸던 내용을 다시바로 확인하고 싶을때가있으니까! ㅋ 

    

    그래서 그럴때 다시 willDisplayCell을호출한다. ( 박수..ㅎ ) 

     

     

    정말 미묘한 변화같지만, 생각보다 엄청나다. 

    이를 iOS X에 적용함으로써 엄청나게 빠른 스크롤 성능을 얻게됐다.

     

     

    이러한 새로운기능은 iOS X에서부터 Default로 사용가능하다. 

    만약에 이전의 스크롤경험을 사용하고싶다면 isPrefetchingEnabled를 false하라. 

     

     

     

     


     

    또 다른 새로운 기능! 

     

    UICollectionView는 두개의중요한 오브젝트가있다 ( data source, delegate ) 

    iOS X부터 새로운 오브젝트가 생겼다 ( prefetchDatasSource ) 

     

    prefetchItemsAt 메서드는 콘텐츠를 비동기적인모델로부터 preload할때 호출된다.

     

    cancelPrefetchingForItemsAt은 더이상스크롤되지않을때 호출된다. 

    취소하거나, 우선순위를 낮출때 사용할수있다. 

     

    가장중요한점은, 

    이기능들은 이미기존에작성한 data model을 대신하는것이아니다. 

    대신, 기존의 비동기적인 솔루션과 같이 작동한다. 

     

     

     

     

    iOS 9에서 스크롤했을때, 8번이나 레드존에들어갔다.

    ( 레드존은 60프레임을 유지하지못하여 프레임드랍이발생하는 경우 ) 

    하지만 iOS X에서는 한번도들어가지않았따!! ( 박수 박수 ) 

     

    하지만, 새로소개한 prefetch API를 적용하면?? 

    완전수평......... ( 박수 박수 ) 

     

     

    pre-fetch API를 잘 적용만한다면, data model read를 메인큐대신 백그라운드큐로 이동하기때문에

    이렇게 큰 성능차이를 가져다준다.

     

     

    prefetch 를 할때는, 백그라운에서 작업을 하도록해라.

    그러기위해서는 GCD나 NSOperationQueue를 사용하라.

    아주빠르게 사용자가 스크롤할때는 충분한 시간이 없다. 그러므로 이때는 pre-fetching을 하지않을것이다.

     

    물론! 당연히 TableView에도 이 기능을 넣었다.  ( 박수박수 )  

     

     

     

     


     

    Self-Sizing Cell

     

    를 지원하기위해서는 estimatedItesmSize를 정해주고,

    아래 3가지중 하나로 실제셀사이즈를 정해주면된다.

     

     

     

    estimatedItemSize를 정하는것이 쉽지않다는것을 안다.

    그래서 우리대신 계산해주도록, 새로운 automatic self-sizing이 생겼다.  ( 박수박수 ) 

     

     

     

     

     


    interactive reordering 

     

    작년에 테이블뷰에서 쉽게 reordring하는 기능을 ColelctionView에 넣었다. 

    아래와같이 선택해서 쉽게 reordring이 가능하다.

     

    필요한 API는 아래와같다.

     

    사용하기위해선느 installStandardGestureForInteractiveMovement를 True로한다.

    이렇게하면 자동적으로 제스쳐를 추가해준다. 

     

     

    올해는,  paging support를 추가했다. 

    새로운 API는 없고, 그저 isPagingEnabled 프로퍼티를 true로하면된다.

     

    이것없이 reordering하면 움직이긴하는데, 

    ISPagingEnabled를 true로하면 페이지단위로 움직인다. ( 홈스크린 앱위치변경할때처럼 ) 

    ( 왼쪽에 흰색에있던부분이 맨오른쪽에 있따! 한번에 보여지는 화면단위로 슥 움직였음!! ) 

     

     


    또다른 새로운기능!!! 

     

    UICollectionView - UIRefreshControl 지원!!

    UITableView도!! 

    UIScrollView도!!

    • 왜냐!! RefreshControlㅇ은 이제 ScrollView프로퍼티임!! 

    ( 아닠ㅋㅋ 너무웃겨서..  이분이랑 다른분이랑 같이 발표하는데 이분이 엄청 열정적으로 신나게 강조하셨음..ㅋㅋㅋㅋ ) 

     

     

    사용방법 너무나간단하다. 

    그냥아래처럼 해주면됌!! 

     

     

     

    댓글