感谢Craig的答案指出了我正确的方向,我有一个解决方案.我还原了我的提交,它根据编辑模式移动了文本位置,并将其替换为一个新的解决方案,可以在调用layoutSubviews时将整个内容视图设置为正确的位置,从而在切换到编辑模式时生成自动动画:
- (void)layoutSubviews { CGRect b = [self bounds]; b.size.height -= 1; // leave room for the separator line b.size.width += 30; // allow extra width to slide for editing b.origin.x -= (self.editing) ? 0 : 30; // start 30px left unless editing [contentView setFrame:b]; [super layoutSubviews]; }
通过这样做,我能够删除在ABTableViewCell.m中找到的setFrame:override,因为它以前的逻辑加上我的添加现在可以在layoutSubviews中找到.
我在单元格上设置了浅灰色背景,以验证自定义背景是否正常工作,而不允许我们在它后面移动时看到它背后,它似乎工作得很好.
再次感谢Craig和其他任何研究过此事的人.
GitHub提交此解决方案:( 链接)
感谢Craig的答案指出了我正确的方向,我有一个解决方案.我还原了我的提交,它根据编辑模式移动了文本位置,并将其替换为一个新的解决方案,可以在调用layoutSubviews时将整个内容视图设置为正确的位置,从而在切换到编辑模式时生成自动动画:
- (void)layoutSubviews { CGRect b = [self bounds]; b.size.height -= 1; // leave room for the separator line b.size.width += 30; // allow extra width to slide for editing b.origin.x -= (self.editing) ? 0 : 30; // start 30px left unless editing [contentView setFrame:b]; [super layoutSubviews]; }
通过这样做,我能够删除在ABTableViewCell.m中找到的setFrame:override,因为它以前的逻辑加上我的添加现在可以在layoutSubviews中找到.
我在单元格上设置了浅灰色背景,以验证自定义背景是否正常工作,而不允许我们在它后面移动时看到它背后,它似乎工作得很好.
再次感谢Craig和其他任何研究过此事的人.
GitHub提交此解决方案:( 链接)
你现在如何移动文本?或者更具体地说,你在哪个UITableViewCell方法中执行移动?
根据我的经验,覆盖layoutSubviews
方法和设置框架将自动包装在动画中.
例如:
- (void)layoutSubviews { if (self.editing) { [titleLabel setFrame:CGRectMake(62, 6, 170, 24)]; } else { [titleLabel setFrame:CGRectMake(30, 6, 200, 24)]; } [super layoutSubviews]; }
要完全控制自定义单元格中的编辑,您应该覆盖UITableViewCell子类中的willTransitionToState方法并检查状态掩码
- (void)willTransitionToState:(UITableViewCellStateMask)state { NSString *logStr = @"Invoked"; if ((state & UITableViewCellStateShowingEditControlMask) != 0) { // you need to move the controls in left logStr = [NSString stringWithFormat:@"%@ %@",logStr,@"UITableViewCellStateShowingEditControlMask"]; } if ((state & UITableViewCellStateShowingDeleteConfirmationMask) != 0) { // you need to hide the controls for the delete button logStr = [NSString stringWithFormat:@"%@ %@",logStr,@"UITableViewCellStateShowingDeleteConfirmationMask"]; } NSLog(@"%@",logStr); [super willTransitionToState:state]; }
你也可以覆盖layoutSubviews
- (void)layoutSubviews { // default place for label CGRect alarmTimeRect = CGRectMake(37, 7, 75, 30); if (self.editing && !self.showingDeleteConfirmation) { // move rect in left alarmTimeRect = CGRectMake(77, 7, 75, 30); } [alarmTimeLabel setFrame:alarmTimeRect]; [super layoutSubviews]; }
要处理滑动:(self.editing &&!self.showingDeleteConfirmation)