0

テーブルセルにスライダがあり、スライダをスライドさせると、そのセルが読み込まれて、セルに更新されたスライダ値が表示されます。テーブルセルの制約の変化をアニメーションにする

そして、ユーザーがスライダをmaxに移動したとき、私はいくつかのアニメーションで自分のセルの要素の幅の拘束を変更したいと思います。

すべて動作しますが、アニメーションを見ることができませんでした。

-(void)sliderValueChanged:(id)sender{ 

    sliderValueChanged = YES; 
    UISlider *slider = (UISlider *)sender; 

    int sliderValue; 
    sliderValue = roundf(slider.value); 
    [slider setValue:sliderValue animated:YES]; 

    NSIndexPath *indexPath = [self getIndexPathForView:slider]; 

    MySliderCell *sliderCell = (MySliderCell *)[self tableView:self.tableView cellForRowAtIndexPath:indexPath]; 

    sliderCell.sliderValueLabel.text = [NSString stringWithFormat:@"%d",sliderValue]; 

    if(sliderValue == 7){ 
     [sliderCell layoutIfNeeded]; 
     sliderCell.radioButonWidth.constant = 40; 
     [UIView animateWithDuration:2.0 
         animations:^{ 
          [sliderCell layoutIfNeeded]; 
         }]; 
    }else{ 
     [sliderCell layoutIfNeeded]; 
     sliderCell.radioButonWidth.constant = 0; 
     [UIView animateWithDuration:2.0 
         animations:^{ 
          [sliderCell layoutIfNeeded]; 
         }]; 

    } 

    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 

    DLog(@"slider value :%d change method called, indexpath is %@",sliderValue,indexPath); 


} 

私もusig setNeedsUpdateConstraintsを試みたが、self.tableView代わりのcelllayoutIfNeededを呼び出しています。しかし何も働かなかった。私は間違って何をしていますか?

+0

私は再ロードの行がセルを再レイアウトし、アニメーション化されていないと推測します。 –

+0

リロードテーブルコールを削除した場合、セルはスライダ値で更新されません!そこに何か回避策がありますか? –

+0

セルで更新する必要があるものは何ですか?既に、sliderValueLabelなどの値を設定しているようです。 –

答えて

1

あなたの例の問題は、reloadRowsAtIndexPathsをアニメーションブロックと同じループで呼び出すことです。一般的には、その呼び出しを取り除くだけです。アニメーションは機能するはずです。

コメントから、それを呼び出さなければテキストがセル内で変更され、スライダアクションメソッドから要求したときに正しいセルが得られない可能性があるという問題につながるようです。

テーブルビューセルのサブクラス内で常にセルのすべてのコンセントを使用することをお勧めします。この方法では、getIndexPathForView,cellForRowAtIndexPathを呼び出さずに、適切なサブビューにアクセスできることを常に確認できます。場合によっては、インデックスパスがmyObject = self.array[indexPath.row]のオブジェクトをデータソース配列から取得することもできます。そうすることで、セルからの通知をテーブルビューの所有者(通常はビューコントローラ)に戻すという唯一の欠点があります。その場合、一般的にカスタムデリゲートを使用します。カスタムデリゲートでは、セルがデリゲート(ビューコントローラ)への弱い参照を持ち、必要なアクションでデリゲートを呼び出します。

ヘッダーに:そのようなテーブルビューセルの一例を与えるために

@class MyTableViewCell; 

@protocol MyTableViewCellDelegate <NSObject> 

- (void)myTableViewCell:(MyTableViewCell *)sender changedSliderValue:(CGFloat)newValue; 

@end 

@interface MyTableViewCell : UITableViewCell 

@property (nonatomic, weak) id<MyTableViewCellDelegate> delegate; 
@property (nonatomic, strong) MyCustomObject *myObject; // The object this cell is designed to represent 


@end 

出典:

@interface MyTableViewCell() 

@property (nonatomic, weak) IBOutlet UISlider *slider; 

@end 

@implementation MyTableViewCell 

- (void)setMyObject:(MyCustomObject *)myObject { 
    _myObject = myObject; 

    // Set any UI properties needed 
    self.slider.value = myObject.magnitude; 
} 

- (void)sliderValueChanged:(UISlider *)sender { 

    self.myObject.magnitude = sender.value; 
    [self.delegate myTableViewCell:self changedSliderValue:sender.value]; 

    // Your animation code goes here as well 

} 

@end 

だから、あなたはあなたが、その後のような何かをするだろうセルをデキューする場合:

MyTableViewCell *cell = ... 
cell.delegate = self; 
cell.myObject = self.myArray[indexPath.row]; 

そして、セルスライダが変更されたときにビューコントローラ内に通知が必要な場合は、単にデリゲートメソッドを実装します。

0

[UIView animateWithDuration:animations:completion:]を使い、 "sliderValueChanged"メソッドでパラメータとして完了ブロックを受け入れると、ブロック内のtableViewをリロードしてtableViewの参照を削除できます。

関連する問題