Snapchat이나 Instagram 같은 CollectionView를 라이브러리화했습니다!
10268 단어 iOSUIKitSwiftcollectionView
SnapLikeCollectionView
어떤 라이브러리?
내가 맡는 Graffity Inc.에서는 ARKit을 사용한 앱을 많이 만들고 있기 때문에 항상 카메라 UI를 만들고 있습니다.
그렇다면 스스로 Instagram이나 Snapchat 같은 CollectionView를 만드는 것입니다.
지금 만들고 있는 앱으로, 벌써 3번째 정도이므로, 좋은 가감 라이브러리화했습니다. 아무래도 copipe 하는 것은 시간의 낭비이고, 완벽한 코드는 아니지만, 수요 있을 것 같다고 생각하기 때문입니다.
Instagram과 Snapchat과의 비교
만든 사람
Instagram
Snapchat
Cell을 원하는 대로 사용자 정의하면 Instagram처럼 텍스트 셀이나 Snapchat처럼 이미지 셀이 될 수 있습니다.
설치 방법
Cocoapods만 준비했습니다.
Podfile에 다음을 추가하십시오 pod install
pod 'SnapLikeCollectionView'
사용법
셀 준비
Cell은 UICollectionViewCell
를 상속하고 SnapLikeCell
를 준수하면 원하는대로 사용자 정의 할 수 있습니다.
public protocol SnapLikeCell: class {
associatedtype Item
var item: Item? { get set }
}
위와 같이 SnapLikeCell에 Item이라는 asociatedtype이 있으므로 여기에 원하는 형식을 넣으십시오. 샘플 코드에서는 String을 넣고 있습니다만, 자작의 모델등을 넣는 것이 추천입니다.
import UIKit
import SnapLikeCollectionView
class SampleCell: UICollectionViewCell, SnapLikeCell {
@IBOutlet weak var titleLabel: UILabel!
var item: String? {
didSet {
titleLabel.text = item
}
}
}
실제로 위와 같이 사용합니다. Item의 associatedtype에 String을 넣은 예입니다.
CollectionView에 dataSource 및 FlowLayout 적용
코멘트에 설명을 써 갑니다.
import UIKit
import SnapLikeCollectionView
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
// <SampleCell>の部分に先ほど作ったオリジナルのCellの型を入れる
private var dataSource: SnapLikeDataSource<SampleCell>?
override func viewDidLoad() {
super.viewDidLoad()
// 真ん中にいる時と通常時のcellの大きさを入れる
let cellSize = SnapLikeCellSize(normal: 100, center: 160)
// cellSizeとcollectionViewを渡してdataSouceをinit
dataSource = SnapLikeDataSource<SampleCell>(collectionView: collectionView, cellSize: cellSize)
dataSource?.delegate = self
// flowLayoutにもcellSizeを渡す
let layout = SnapLikeCollectionViewFlowLayout(cellSize: cellSize)
collectionView.collectionViewLayout = layout
// ここはお決まりな感じ。decelerationRateとか以外と大事です。
collectionView.registerNib(SampleCell.self)
collectionView.showsHorizontalScrollIndicator = false
collectionView.decelerationRate = .fast
collectionView.backgroundColor = .clear
collectionView.delegate = dataSource
collectionView.dataSource = dataSource
// 先ほどCellのItemに入れた型のarrayをitemsに入れていきます。
dataSource?.items = ["A", "B", "C", "D", "E"]
}
}
// cellが選択されたらcellSelectedが呼ばれます
extension ViewController: SnapLikeDataDelegate {
func cellSelected(_ index: Int) {
DispatchQueue.main.async { [weak self] in
let selectedItem: String = self?.dataSource?.items[index] ?? ""
self?.titleLabel.text = selectedItem
}
}
}
도전
내가 맡는 Graffity Inc.에서는 ARKit을 사용한 앱을 많이 만들고 있기 때문에 항상 카메라 UI를 만들고 있습니다.
그렇다면 스스로 Instagram이나 Snapchat 같은 CollectionView를 만드는 것입니다.
지금 만들고 있는 앱으로, 벌써 3번째 정도이므로, 좋은 가감 라이브러리화했습니다. 아무래도 copipe 하는 것은 시간의 낭비이고, 완벽한 코드는 아니지만, 수요 있을 것 같다고 생각하기 때문입니다.
Instagram과 Snapchat과의 비교
만든 사람
Instagram
Snapchat
Cell을 원하는 대로 사용자 정의하면 Instagram처럼 텍스트 셀이나 Snapchat처럼 이미지 셀이 될 수 있습니다.
설치 방법
Cocoapods만 준비했습니다.
Podfile에 다음을 추가하십시오 pod install
pod 'SnapLikeCollectionView'
사용법
셀 준비
Cell은 UICollectionViewCell
를 상속하고 SnapLikeCell
를 준수하면 원하는대로 사용자 정의 할 수 있습니다.
public protocol SnapLikeCell: class {
associatedtype Item
var item: Item? { get set }
}
위와 같이 SnapLikeCell에 Item이라는 asociatedtype이 있으므로 여기에 원하는 형식을 넣으십시오. 샘플 코드에서는 String을 넣고 있습니다만, 자작의 모델등을 넣는 것이 추천입니다.
import UIKit
import SnapLikeCollectionView
class SampleCell: UICollectionViewCell, SnapLikeCell {
@IBOutlet weak var titleLabel: UILabel!
var item: String? {
didSet {
titleLabel.text = item
}
}
}
실제로 위와 같이 사용합니다. Item의 associatedtype에 String을 넣은 예입니다.
CollectionView에 dataSource 및 FlowLayout 적용
코멘트에 설명을 써 갑니다.
import UIKit
import SnapLikeCollectionView
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
// <SampleCell>の部分に先ほど作ったオリジナルのCellの型を入れる
private var dataSource: SnapLikeDataSource<SampleCell>?
override func viewDidLoad() {
super.viewDidLoad()
// 真ん中にいる時と通常時のcellの大きさを入れる
let cellSize = SnapLikeCellSize(normal: 100, center: 160)
// cellSizeとcollectionViewを渡してdataSouceをinit
dataSource = SnapLikeDataSource<SampleCell>(collectionView: collectionView, cellSize: cellSize)
dataSource?.delegate = self
// flowLayoutにもcellSizeを渡す
let layout = SnapLikeCollectionViewFlowLayout(cellSize: cellSize)
collectionView.collectionViewLayout = layout
// ここはお決まりな感じ。decelerationRateとか以外と大事です。
collectionView.registerNib(SampleCell.self)
collectionView.showsHorizontalScrollIndicator = false
collectionView.decelerationRate = .fast
collectionView.backgroundColor = .clear
collectionView.delegate = dataSource
collectionView.dataSource = dataSource
// 先ほどCellのItemに入れた型のarrayをitemsに入れていきます。
dataSource?.items = ["A", "B", "C", "D", "E"]
}
}
// cellが選択されたらcellSelectedが呼ばれます
extension ViewController: SnapLikeDataDelegate {
func cellSelected(_ index: Int) {
DispatchQueue.main.async { [weak self] in
let selectedItem: String = self?.dataSource?.items[index] ?? ""
self?.titleLabel.text = selectedItem
}
}
}
도전
Cocoapods만 준비했습니다.
Podfile에 다음을 추가하십시오
pod install
pod 'SnapLikeCollectionView'
사용법
셀 준비
Cell은 UICollectionViewCell
를 상속하고 SnapLikeCell
를 준수하면 원하는대로 사용자 정의 할 수 있습니다.
public protocol SnapLikeCell: class {
associatedtype Item
var item: Item? { get set }
}
위와 같이 SnapLikeCell에 Item이라는 asociatedtype이 있으므로 여기에 원하는 형식을 넣으십시오. 샘플 코드에서는 String을 넣고 있습니다만, 자작의 모델등을 넣는 것이 추천입니다.
import UIKit
import SnapLikeCollectionView
class SampleCell: UICollectionViewCell, SnapLikeCell {
@IBOutlet weak var titleLabel: UILabel!
var item: String? {
didSet {
titleLabel.text = item
}
}
}
실제로 위와 같이 사용합니다. Item의 associatedtype에 String을 넣은 예입니다.
CollectionView에 dataSource 및 FlowLayout 적용
코멘트에 설명을 써 갑니다.
import UIKit
import SnapLikeCollectionView
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
// <SampleCell>の部分に先ほど作ったオリジナルのCellの型を入れる
private var dataSource: SnapLikeDataSource<SampleCell>?
override func viewDidLoad() {
super.viewDidLoad()
// 真ん中にいる時と通常時のcellの大きさを入れる
let cellSize = SnapLikeCellSize(normal: 100, center: 160)
// cellSizeとcollectionViewを渡してdataSouceをinit
dataSource = SnapLikeDataSource<SampleCell>(collectionView: collectionView, cellSize: cellSize)
dataSource?.delegate = self
// flowLayoutにもcellSizeを渡す
let layout = SnapLikeCollectionViewFlowLayout(cellSize: cellSize)
collectionView.collectionViewLayout = layout
// ここはお決まりな感じ。decelerationRateとか以外と大事です。
collectionView.registerNib(SampleCell.self)
collectionView.showsHorizontalScrollIndicator = false
collectionView.decelerationRate = .fast
collectionView.backgroundColor = .clear
collectionView.delegate = dataSource
collectionView.dataSource = dataSource
// 先ほどCellのItemに入れた型のarrayをitemsに入れていきます。
dataSource?.items = ["A", "B", "C", "D", "E"]
}
}
// cellが選択されたらcellSelectedが呼ばれます
extension ViewController: SnapLikeDataDelegate {
func cellSelected(_ index: Int) {
DispatchQueue.main.async { [weak self] in
let selectedItem: String = self?.dataSource?.items[index] ?? ""
self?.titleLabel.text = selectedItem
}
}
}
도전
public protocol SnapLikeCell: class {
associatedtype Item
var item: Item? { get set }
}
import UIKit
import SnapLikeCollectionView
class SampleCell: UICollectionViewCell, SnapLikeCell {
@IBOutlet weak var titleLabel: UILabel!
var item: String? {
didSet {
titleLabel.text = item
}
}
}
import UIKit
import SnapLikeCollectionView
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
// <SampleCell>の部分に先ほど作ったオリジナルのCellの型を入れる
private var dataSource: SnapLikeDataSource<SampleCell>?
override func viewDidLoad() {
super.viewDidLoad()
// 真ん中にいる時と通常時のcellの大きさを入れる
let cellSize = SnapLikeCellSize(normal: 100, center: 160)
// cellSizeとcollectionViewを渡してdataSouceをinit
dataSource = SnapLikeDataSource<SampleCell>(collectionView: collectionView, cellSize: cellSize)
dataSource?.delegate = self
// flowLayoutにもcellSizeを渡す
let layout = SnapLikeCollectionViewFlowLayout(cellSize: cellSize)
collectionView.collectionViewLayout = layout
// ここはお決まりな感じ。decelerationRateとか以外と大事です。
collectionView.registerNib(SampleCell.self)
collectionView.showsHorizontalScrollIndicator = false
collectionView.decelerationRate = .fast
collectionView.backgroundColor = .clear
collectionView.delegate = dataSource
collectionView.dataSource = dataSource
// 先ほどCellのItemに入れた型のarrayをitemsに入れていきます。
dataSource?.items = ["A", "B", "C", "D", "E"]
}
}
// cellが選択されたらcellSelectedが呼ばれます
extension ViewController: SnapLikeDataDelegate {
func cellSelected(_ index: Int) {
DispatchQueue.main.async { [weak self] in
let selectedItem: String = self?.dataSource?.items[index] ?? ""
self?.titleLabel.text = selectedItem
}
}
}
요약
실은 최초의 라이브러리 배포였습니다만, 이외라고 순조롭게 되었습니다. 미리 프로젝트내에서 Embedded Framework화는 하고 있었으므로, 밖에 내놓고 Demo 앱 만드는 것만으로 만들 수 있었습니다.
⬇️꼭 스타를! ! ⭐️⭐️⭐️⭐️⭐️
Reference
이 문제에 관하여(Snapchat이나 Instagram 같은 CollectionView를 라이브러리화했습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kboy/items/8429c3210c899c916117
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Snapchat이나 Instagram 같은 CollectionView를 라이브러리화했습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kboy/items/8429c3210c899c916117텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)