尝试删除iOS7中的行时,单元格文本与editingAccessory重叠

时间:2013-10-22 09:33:56

标签: objective-c uitableview ios7 overlap

当我在新的iOS7中编译我的应用程序时,我在进入UITableView的编辑模式时发现了一个问题。

当我按下红色减号按钮删除表格的一行时,此行向左缩进以显示“删除”按钮。但是,当出现此按钮时,单元格的文本与editingAccesory重叠(仅当文本长于单元格的长度时才会发生这种情况)。

如何删除重叠?

编辑评论中的图片

编辑2: Tis是创建表格的代码

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{  
        return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
        return [_tweetList count];
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        static NSString *CellIdentifier = @"SessionDetailCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        Tweet *tweet = [_tweetList objectAtIndex:indexPath.row];
        cell.textLabel.text = tweet.text;
        return cell;
 }

 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
        if (editingStyle == UITableViewCellEditingStyleDelete) {
                [tableView beginUpdates];

                Tweet *deletedTweet = [_tweetList objectAtIndex:indexPath.row];
                [_selectedSession removeTweetsObject:deletedTweet];
                [deletedTweet deleteEntity];
                _tweetList = [Tweet findAllSortedBy:@"index" ascending:YES withPredicate:[NSPredicate predicateWithFormat:@"session == %@",_selectedSession]];
                [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

                [tableView endUpdates];
        }
        [[NSManagedObjectContext defaultContext]saveToPersistentStoreWithCompletion:nil];
}

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
        selectedPath = indexPath;
        [self performSegueWithIdentifier:@"EditTweet" sender:self];
}

解决方案:

最后,我将accessoryButton置于默认状态,并且仅使用编辑状态来删除行。这是我找到的唯一解决方案:(

也许,方法“willTransitionToState”可以帮助人们解决类似的问题。

2 个答案:

答案 0 :(得分:1)

您可以在编辑模式中隐藏或删除 editingAccesory ,因此不存在重叠,

设置这个, enter image description here

<强>截图:

enter image description here

答案 1 :(得分:0)

我遇到了这个问题,因为在iOS 8.3中我遇到了同样的问题,似乎无法正确显示编辑附件和删除确认而没有单元格内容和附件项重叠。在不破坏过渡动画的情况下解决这个问题是一个相当大的挑战。 ;)

所以这是我的解决方案(假设您在IB中使用自动布局约束):

  1. 创建一个UITableViewCell子类并将其链接到IB中的表格视图单元格。
  2. 从autolayout约束中添加一个出口,指定最右侧视图和单元格内容视图之间的水平间距(尾随到边距)。
  3. 覆盖willTransitionToStatelayoutSubviews,如下所示。
  4. 表格单元子类:

    @IBOutlet weak var horizontalSpaceConstraint: NSLayoutConstraint!
    
    override func willTransitionToState(state: UITableViewCellStateMask) {
        if (state & UITableViewCellStateMask.ShowingDeleteConfirmationMask == UITableViewCellStateMask.ShowingDeleteConfirmationMask) {
            self.horizontalSpaceConstraint.constant = 49.0; // ugly, delete-confirmation width
        }
        super.willTransitionToState(state)
    }
    
    override func layoutSubviews() {
        if (!self.showingDeleteConfirmation) {
            self.horizontalSpaceConstraint.constant = 0.0;
        }
        super.layoutSubviews()
    }
    

    我无法使用didTransitionToState()(并使用layoutSubviews来重置布局约束)的原因是,在从删除转换之后,不会调用此函数(从iOS 8.3开始)确认状态。似乎Apple只处理了这种情况,用户实际上删除了该行,但没有删除行确认关闭删除确认的情况。 :(