【Swift】 자유도가 높은 DataGridView 만들기

16786 단어 iOSSwiftiPad아이폰

개요



여러 이벤트를 잡을 수 있는 GridTable을 만들고 싶습니다.
내 목적은 캘린더 형식의 테이블에 여러 체크 마크를 넣고있다, 코멘트를 넣는 등

개발 중....CustomGridTableViewController@GitHub


TODO 잔



・스와이프등으로 열 내용을 바꾸는
・열이 남을 경우는 조정하도록 한다
· 문자열 인서트 처리
· 이벤트에 입력한 데이터를 유지
· 미세한 동작 검증
・사용법을 정리한다
등등 아직도 여러가지 있습니다만, 이번은 다음 주말에 잔여를 진행해 갈까라고 생각합니다.
다음주가 되지 않으면 실기도 없고.

개발



STEP 1 우선 그리드 표시



iPhone / iPad에서도 데이터를 Grid로 표시하는 방법 GitHub
여기를 바탕으로 하고, ObjectiveC의 소스를 Swift로 컨버트했습니다.
ObjectiveC를 모르고 커스터마이즈에 시간이 걸리는 것보다 컨버트하는 것이 빠르다고 생각했기 때문에.


STEP 2 레이아웃 사용자 정의



· 헤더 크기 사용자 정의
· 배경색 사용자 정의
・셀은 모두 align center로 변경

CustomGridTableViewController.swift
/**
カスタマイズ項目
oddBackgroundColor:奇数行の背景色
headerHeihgt:ヘッダーの高さ
cellHeight:Cellの高さ
*/
var oddBackgroundColor:UIColor = UIColor(red: 0, green: 0, blue: 50, alpha: 0.1)
var headerHeihgt:CGFloat = 30.0
var cellHeight:CGFloat = 30.0

헤더 및 셀 높이를 40, 45로 변경 기본 홀수 행 배경색


STEP 3 이벤트 추가



· 셀의 터치 이벤트를 사용자 정의 가능하게 만들기
터치한 셀의 배경색을 빨간색으로 변경
또한 왼쪽에서 오른쪽으로 드래그한 셀의 색을 변경(열이 어긋나면 반응하지 않게 된다)

터치 이벤트가 UIGestureRecognizer 라든지 addTarget 라든지 여러가지 시도했지만 생각했던대로 움직이지 않았기 때문에,
TableView를 상속하여 터치 이벤트를 override했습니다.
동작에 대해서는 CustomGridTableViewController의 static을 참조하도록 하고 있으므로,
동작을 바꾸고 싶을 때는 tableTouchDelegate를 다시 쓰면 다른 동작이 될 것입니다.
어쩌면. 아직 시도하지 않았습니다.

CustomGridTableViewController.swift
class CustomGridTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    static var staticTableView: UITableView = CustomUITableView()
    static var staticCols:Array<GridColumn> = Array()
    static var touchBeganCol:Int = 0

    /**
    カスタマイズ項目
    oddBackgroundColor:奇数行の背景色
    headerHeihgt:ヘッダーの高さ
    cellHeight:Cellの高さ
    tblTouchDelegate(UILabel,UITouch):タッチされたセルに対するイベント
    */
    var oddBackgroundColor:UIColor = UIColor(red: 0, green: 0, blue: 50, alpha: 0.1)
    var headerHeihgt:CGFloat = 40
    var cellHeight:CGFloat = 45
    static var tableTouchDelegate:(UILabel,UITouch) -> () = {(touchedLabel:UILabel,touch:UITouch) -> () in
        touchedLabel.backgroundColor = UIColor.redColor()
    }
    static var tableViewTouchBegan:(UITouch) -> () = {(touch:UITouch) -> () in
        let location = touch.locationInView(CustomGridTableViewController.staticTableView)
        if let indexPath = CustomGridTableViewController.staticTableView.indexPathForRowAtPoint(location){
            CustomGridTableViewController.touchBeganCol = CustomGridTableViewController.getColumnIndex(Int(location.x))
        }
        CustomGridTableViewController.addTouchTableViewDelegate(touch)
    }
    static var tableViewTouchMove:(UITouch) -> () = {(touch:UITouch) -> () in
        CustomGridTableViewController.addTouchTableViewDelegate(touch)
    }
    static var tableViewTouchEnd:(UITouch) -> () = {(touch:UITouch) -> () in
        CustomGridTableViewController.addTouchTableViewDelegate(touch)
    }

    static func addTouchTableViewDelegate(touch:UITouch){
        let location = touch.locationInView(CustomGridTableViewController.staticTableView)
        if let indexPath = CustomGridTableViewController.staticTableView.indexPathForRowAtPoint(location){
            println(indexPath.row)
            var touchEndCol:Int = CustomGridTableViewController.getColumnIndex(Int(location.x))
            for (var i = 0; i <= touchEndCol - CustomGridTableViewController.touchBeganCol ; i++) {
                let touchMoveCol = CustomGridTableViewController.touchBeganCol + i
                if let label = CustomGridTableViewController.staticTableView.viewWithTag(touchMoveCol + (indexPath.row * 1000)) as? UILabel{
                    CustomGridTableViewController.tableTouchDelegate(label,touch)
                }
            }
        }
    }
}

class CustomUITableView:UITableView{
    /**
    touchesBeganイベント
    */
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        // タッチイベントを取得.
        let touch = touches.first as! UITouch
        CustomGridTableViewController.tableViewTouchBegan(touch)
    }

    /**
    touchesEndedイベント
    */
    override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as! UITouch
        CustomGridTableViewController.tableViewTouchEnd(touch)
    }
    /**
    touchesMovedイベント
    */
    override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
        let touch = touches.first as! UITouch
        CustomGridTableViewController.tableViewTouchMove(touch)
    }
}


다음 대응



2015.09.09 지정한 위치에 Grid를 배치할 수 있도록 수정되었습니다.
【Swift】 지정한 위치에 GridTable 만들기

좋은 웹페이지 즐겨찾기