Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 653 - longPressed()の実装は続く

次のTable Viewのチュートリアルを拡張しています。

yataiblue.hatenablog.com

ロングプレスが発動すると、ロングプレスの持つ「state」プロパティが変化して、longPressed()メソッドが呼ばれます。

ということでstateの状態で挙動を変える必要があります。そういうときに便利なのが「switch-case」です。

switch state {
            
  case UIGestureRecognizerState.Began:

  case UIGestureRecognizerState.Changed:

  default:

}

このUIGestureRecognizerStateを少し調べて見ると以下のよううな状態(state)がありました。興味深いのが最後のタイプ・プロパティの「Recognized」ですね。これをどのように使えばいいのか気になりますが今回はパスします。

enum UIGestureRecognizerState : Int {
    case Possible
    case Began
    case Changed
    case Ended
    case Cancelled
    case Failed
    static var Recognized: UIGestureRecognizerState { get }
}

まず「UIGestureRecognizerState.Began」の挙動を制御します。まずロングプレスが発動した位置にあるセルをスナップショットとして情報を読み込むのですが、最初にちゃんとセル内でロングプレスが発動しているかどうか確認する必要があります。

guard let selectedIndexPath = indexPath else {
   break
}

チュートリアルは「if」を使っていますが、私はアンラップさせる時に「guard」を使用した方がスッキリするので変更しました。

次はスナップショットのセル情報を持ちます。

MyCell.initialIndexPath = selectedIndexPath
let cell = 
 simpleTableView.cellForRowAtIndexPath(selectedIndexPath) 
   as UITableViewCell!
MyCell.cellSnapshot = snapshotOfCell(cell)
var center = cell.center
MyCell.cellSnapshot?.center = center
MyCell.cellSnapshot!.alpha = 0.0
simpleTableView.addSubview(MyCell.cellSnapshot!)

ここでも知らないと使えないUITableVIewが持っているメソッドが出てきます*1

cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell?

「cellForRowAtIndexPath()」はNSIndexPathを与えてUITableViewCellを返します。詳しい情報は「Opt + ドラッグ」ですね。

f:id:yataiblue:20160423152705j:plain

次の「snapShotOfCell()」はカスタムメソッドです。クラス内に定義してやらないといけません。このメソッドはUITableViewCell情報からスナップショットとなるViewクラスを返すメソッドですね。

次にCellの位置情報をView情報にして、「alpha」値は透明度の設定で、「0.0(透明)〜1.0(不透明)」で指定します。今回この値を色々変えてみてもアプリで変化がないのが不思議です。もう少し検証が必要ですね。時間ができたらします。できあがったUIViewオブジェクトをTableViewに加えて表示するという仕組みです。

今日はここまで。

*1:UITableViewの持っているメソッドをまとめたページを用意します。