gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:31:16 25 4
gpt4 key购买 nike

我的表格单元格中有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com