当删除按钮出现时,在自定义表格视图单元格中缺少UISlider宽度的动画

问题描述:

这是一个微妙的问题:我有一个带滑块和分段控件的自定义tableview单元格。当表格进入编辑模式时,一切看起来都很好,当红色的删除按钮出现时,滑块和分段控件的宽度会缩小,从而在右侧为删除按钮留出空间,并且此缩小会正确动画。所以一切都很好。当删除按钮出现时,在自定义表格视图单元格中缺少UISlider宽度的动画

但是,当用户没有通过删除操作并跳出界限时,滑块会在删除按钮动画轻扫完成之前立即弹回到其全部宽度。然而,分段控制被正确地动画回到其全部宽度。我没有自己处理任何动画。为什么滑块不能动画?我的设置代码如下。有任何想法吗?

请注意,当左侧圆形红色选择按钮出现或消失时,所有元素的动画效果都很好。

如果我不能修复这个问题,我想知道如何从内容推到左边停止删除按钮出现时,但保留选择按钮压痕动画。

NSArray *itemArray = @[@"1", @"2", @"3", @"4"]; 
self.source = [[[UISegmentedControl alloc] initWithItems:itemArray] autorelease]; 
self.source.frame = CGRectMake(80, 10, cb.size.width - 92, 36); 
self.source.segmentedControlStyle = UISegmentedControlStylePlain; 
self.source.selectedSegmentIndex = 0; 
self.source.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[self.contentView addSubview:self.source]; 

self.phaseSlider = [[[UISlider alloc] initWithFrame:CGRectMake(80, 50, cb.size.width - 92, 36)] autorelease]; 
self.phaseSlider.continuous = TRUE; 
self.phaseSlider.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
[self.contentView addSubview:self.phaseSlider]; 

我发现了这个解决方案。显然,使用调整大小掩码时会出现一些问题,以便在删除按钮出现时允许滑块调整大小。相反,我删除了灵活的宽度调整大小掩码。我初始化initWithStyle中的控件,但只设置layoutSubViews中的帧。这实际上是设置控制帧的更好方法,因为单元格的宽度和高度在initWithStyle中实际上并不确定。当您在layoutSubViews中设置框架时,会在删除按钮出现和消失动画期间被调用,并且位置和大小会正确动画。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) 
    { 
     // Initialization code 
     NSArray *itemArray = @[@"1", @"2", @"3", @"4"]; 
     self.source = [[[UISegmentedControl alloc] initWithItems:itemArray] autorelease]; 
     self.source.segmentedControlStyle = UISegmentedControlStylePlain; 
     self.source.selectedSegmentIndex = 0; 
     [self.contentView addSubview:self.source]; 

     self.phaseSlider = [[[UISlider alloc] initWithFrame:CGRectZero] autorelease]; 
     self.phaseSlider.continuous = TRUE; 
     [self.contentView addSubview:self.phaseSlider]; 

     self.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    return self; 
} 

- (void)layoutSubviews 
{  
    [super layoutSubviews]; 

    float w = self.contentView.bounds.size.width; 

    self.source.frame = CGRectMake(78, 10, w - 92, 36); 
    self.phaseSlider.frame = CGRectMake(78, 50, w - 92, 36); 
} 
+0

你知道你可以接受你自己的解决方案吗? – 2015-07-03 21:04:06