2

ユーザーがピンチしたときに、個々の UITableViewCell のサイズを変更しようとしています。「ピンチ」が十分に大きくなったら、セグエを実行したいと思います。

したがって、cellForRowAtIndexPath で。UIPinchGestureRecognizer を割り当て/初期化し、セルにアタッチします。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

       static NSString *CellIdentifier = @"Cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

       /** adding info to the cell **/ 

       UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(makeBiggerCell:)];
       [cell addGestureRecognizer:pinchGesture];
       return cell;
}

次のメソッドでは、ユーザーのジェスチャーに基づいて選択した行の高さを計算 (および設定) し、それを「再描画」したいと考えていました。私が言ったように、ジェスチャが終了し、セルが十分に大きい場合は、セグエを実行したいと思います。

- (void)makeBiggerCell:(UIPinchGestureRecognizer *)gesture {

      if (gesture.state == UIGestureRecognizerStateChanged){

          // I have a private property of NSIndexPath in order to keep 
          // track of the selected row.
          self.selectedIndexPath = [self.tableView indexPathForCell:(UITableViewCell *)sender.view];

         CGPoint windowPoint = [gesture locationOfTouch:1 inView:nil];
         CGPoint tablePoint =  [gesture locationInView:self.tableView];


         self.sizeOfCell = fabsf(tablePoint.y - windowPoint.y);

         // the MINIMUM_CELL_SIZE is the regular size of the cell 
         // this conditional tries to avoid small tableviewcells
         // IMPORTANT: as long as the user keeps his fingers on the cell 
         // the 'resize' happens

         if (self.sizeOfCell > MINIMUM_CELL_SIZE)
            [self.tableView reloadRowsAtIndexPaths:@[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationNone];

     }else if (sender.state == UIGestureRecognizerStateEnded){

         if (sender.scale >=5) {
            [self performSegueWithIdentifier:@"MySegue" sender:sender.view];
         }
      }

}

最後に、選択した行の高さを設定した場所

  - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
      if (self.selectedIndexPath && self.selectedIndexPath.row == indexPath.row && self.sizeOfCell) 
          return self.sizeOfCell + MINIMUM_CELL_SIZE; 
else 
         return MINIMUM_CELL_SIZE;
  }

2 つのプロパティ (sizeOfCell と selectedIndexPath) を持つこと以外の問題は、uitableviewcell のサイズを変更する外観であり、十分に「滑らか」に見えません。セルをつまんでセグエを実行すると、iOS 7 の天気アプリのようなものを実現したいと考えています。

皆さんが私の問題に対するよりクリーンな解決策を持っているなら、私はとても感謝しています! :]

4

1 に答える 1

0

試してみることをお勧めします...スムーズな結果が得られるかどうかはわかりません....pinchGestureのスケールを使用してサイズを設定し、変更するたびにスケールを1に戻してください。

if (pinchGesture.state == UIGestureRecognizerStateChanged || pinchGesture.state == UIGestureRecognizerStateEnded) { 
    self.sizeOfCell.width *= pinchGesture.scale; 
    self.sizeOfCell.height *= pinchGesture.scale; 
    pinchGesture.scale = 1; 
    [self.tableView reloadRowsAtIndexPaths: @[self.selectedIndexPath] withRowAnimation:UITableViewRowAnimationNone]; 
}

performSegue は @property sizeOfCell のセッターで呼び出され、5 より大きい場合と performSegue をチェックする必要があります。

幸運を。

于 2013-08-21T05:06:13.403 に答える