4

在此处输入图像描述我有UITableViewCell如下图所示。

单元格占据删除所占据的高度。设置单元格高度以保持两个单元格之间的间距。

现在,当我滑动并删除按钮出现时(红色),它占据了如上图所示的单元格高度。我只想将其高度设置为白色部分的高度,或者说灰色按钮的高度。谁能帮我设置滑动后出现的删除按钮的高度UITableViewCell

4

8 回答 8

4

解决这个问题的最好方法是覆盖

-(void)layoutSubviews in YourCustomCell:UITableViewCell    

然后

if ([NSStringFromClass([subview class])isEqualToString:@"UITableViewCellDeleteConfirmationControl"]){
            UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
                                CGRect buttonFrame = deleteButtonView.frame;
                                buttonFrame.origin.x = Xvalue;
                                buttonFrame.origin.y = Yvalue;
                                buttonFrame.size.width = Width;
                                buttonFrame.size.height = Height;
                                deleteButtonView.frame = buttonFrame;

         }
于 2014-07-01T04:31:32.973 回答
4

在您的自定义 Cell 类中使用此代码

 -(void) layoutSubviews
{
    NSMutableArray *subviews = [self.subviews mutableCopy];
    UIView *subV = subviews[0];
    if ([NSStringFromClass([subV class])isEqualToString:@"UITableViewCellDeleteConfirmationView"]){
      [subviews removeObjectAtIndex:0];
      CGRect f = subV.frame;
      f.size.height = 106; // Here you set height of Delete button
      subV.frame = f;
     }

}

于 2015-01-14T06:10:06.773 回答
4

Swift 5,适用于 iOS12、iOS13 和 iOS14

  func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {
    // for iOS13, iOS14
    if let swipeContainerView = tableView.subviews.first(where: { String(describing: type(of: $0)) == "_UITableViewCellSwipeContainerView" }) {
      if let swipeActionPullView = swipeContainerView.subviews.first, String(describing: type(of: swipeActionPullView)) == "UISwipeActionPullView" {
        swipeActionPullView.frame.size.height -= 10
      }
    }

    // for iOS12
    tableView.subviews.forEach { subview in
      if String(describing: type(of: subview)) == "UISwipeActionPullView" {
        subview.frame.size.height -= 10
      }
    }
  }
于 2021-01-04T21:51:56.280 回答
3

将此方法添加到您的 customCell.m 文件中。

-(void) layoutSubviews
{
    NSMutableArray *subviews = [self.subviews mutableCopy];
    UIView *subview = subviews[0];

    if ([NSStringFromClass([subview class])isEqualToString:@"UITableViewCellDeleteConfirmationView"]){
        UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
        CGRect buttonFrame = deleteButtonView.frame;
        buttonFrame.origin.x = deleteButtonView.frame.origin.x;
        buttonFrame.origin.y = deleteButtonView.frame.origin.y;
        buttonFrame.size.width = deleteButtonView.frame.size.width;
        buttonFrame.size.height = 46;
        deleteButtonView.frame = buttonFrame;
        subview.frame=CGRectMake(subview.frame.origin.x, subview.frame.origin.y, subview.frame.size.width, 46);
        deleteButtonView.clipsToBounds=YES;
        subview.clipsToBounds=YES;
    }
}
于 2015-12-23T11:56:08.973 回答
2

对于 IOS 13,Position 再次发生了变化,而不是在表格视图中,它再次出现在 _UITableViewCellSwipeContainerView 中。因此,您也应该遍历它。看看下面

([NSStringFromClass([subview class]) 
 isEqualToString:@"_UITableViewCellSwipeContainerView"]){

        for (UIView *deleteButtonSubview in subview.subviews){

            if ([NSStringFromClass([deleteButtonSubview class])
                 isEqualToString:@"UISwipeActionPullView"]) {



                if ([NSStringFromClass([deleteButtonSubview.subviews[0] class]) isEqualToString:@"UISwipeActionStandardButton"]) {

                   //do what you want
                }
            }

        }
    }
于 2019-10-02T13:08:02.613 回答
0

在您的自定义单元格中编写以下代码希望它对您有用 -

- (void)willTransitionToState:(UITableViewCellStateMask)state
{
    [super willTransitionToState:state];
    if(state == UITableViewCellStateShowingDeleteConfirmationMask)
     {
        [self performSelector:@selector(resetDeleteButtonSize) withObject:nil afterDelay:0];
     }
 }



- (void)resetDeleteButtonSize
{
    NSMutableArray *subviews = [self.subviews mutableCopy];
    while (subviews.count > 0)
    {
        UIView *subV = subviews[0];
        [subviews removeObjectAtIndex:0];
        if ([NSStringFromClass([subV class])isEqualToString:@"UITableViewCellDeleteConfirmationButton"])
        {
            CGRect f = subV.frame;
            f.size.height = 74;
            subV.frame = f;
            break;
        }
        else
        {
            [subviews addObjectsFromArray:subV.subviews];
        }
    }
}
于 2014-12-17T12:17:50.230 回答
0

要查看它在 IOS 11 中的工作方式,请在您的 UITableViewController 中复制此 Swift 4 代码片段:

 override func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {
    self.tableView.subviews.forEach { subview in
        print("YourTableViewController: \(String(describing: type(of: subview)))")
        if (String(describing: type(of: subview)) == "UISwipeActionPullView") {
            if (String(describing: type(of: subview.subviews[0])) == "UISwipeActionStandardButton") {
                var deleteBtnFrame = subview.subviews[0].frame
                deleteBtnFrame.origin.y = 12
                deleteBtnFrame.size.height = 155


                // Subview in this case is the whole edit View
                subview.frame.origin.y =  subview.frame.origin.y + 12
                subview.frame.size.height = 155
                subview.subviews[0].frame = deleteBtnFrame
                subview.backgroundColor = UIColor.yellow
            }
        }
    }
}

此代码适用于 IOS 11 及更高版本

于 2018-01-24T11:31:00.920 回答
-1

迅速

override func layoutSubviews() {
    super.layoutSubviews()
    for subview in self.subviews {
        if String(describing: type(of: subview.self)) == "UITableViewCellDeleteConfirmationView" {
            let deleteButton = subview
            let deleteButtonFrame = deleteButton.frame
            let newFrame = CGRect(x: deleteButtonFrame.minX, 
                                  y: deleteButtonFrame.minY,
                                  width: deleteButtonFrame.width,
                                  height: yourHeight)
            deleteButton.frame = newFrame
        }
    }
}
于 2017-09-09T14:28:20.700 回答