ios - 表格单元格中的动画约束更改

标签 ios objective-c uitableview uiviewanimation nslayoutconstraint

我的表格单元格中有一个 slider ,当用户滑动它时,我将重新加载该特定单元格以在我的单元格中显示更新后的 slider 值。

当用户将 slider 移动到最大值时,我想用一些动画更改单元格中元素的宽度约束。

一切正常,但我看不到动画。

-(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);


}

我也尝试过使用 setNeedsUpdateConstraints,并在 self.tableView 而不是 cell 上调用 layoutIfNeeded。但没有任何效果。我究竟做错了什么 ?

最佳答案

您示例中的问题是您在与动画 block 相同的循环中调用了 reloadRowsAtIndexPaths。通常,您需要做的就是删除该调用,动画应该可以正常工作。

从评论看来,如果不调用它,甚至单元格中的文本也不会更改,这会导致您在从 slider 操作方法请求单元格时可能无法获得正确的单元格。

我建议您始终在表格 View 单元格的子类中使用单元格的所有导出。这样您就可以始终确保您可以访问正确的 subview ,而无需调用 getIndexPathForViewcellForRowAtIndexPath,在某些情况下,然后从具有该索引路径的数据源数组中获取对象像 myObject = self.array[indexPath.row]。这样做唯一的缺点是将通知从单元格返回给 TableView 所有者(通常是 View Controller )。对于这种情况,您通常使用自定义委托(delegate),其中单元格对委托(delegate)( View Controller )有弱引用,并在需要的任何操作上调用委托(delegate)。举一个这样的表格 View 单元格的例子:

标题:

@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];

如果您需要在单元格 slider 发生变化时在 View Controller 内进行通知,您只需实现委托(delegate)方法即可。

关于ios - 表格单元格中的动画约束更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723149/

相关文章:

ios - 当新消息发送到聊天室时得到通知(当聊天室未加入时)

ios - 尽管使用 dequeueReusableCell,如何仅隐藏特定单元格上的内容?

objective-c - 为什么SDImageCache会在init中执行dispatch_sync?

iphone - NSDocumentDirectory如何工作?

ios - 从 UITableView 中的静态单元格单击时,使 UITextView 变为全屏

ios - 如何从 iOS 中的 CFStream 获取远程地址?

iOS 应用程序在内存不足的情况下的行为

ios - UITableView 以编程方式滚动到元素

ios - UITableView 显示,但单元格中没有任何名称

ios - deleteRowsAtIndexPaths : swipe to delete rows never deallocates the cell?