在UITableviewcell的ios 11 layoutsubview子视图中找不到UITableViewCellDeleteConfirmationView?

我必须覆盖Tableviewcell中的高度滑动删除按钮我使用下面的代码它工作正常ios 10但在ios11中我无法在layoutsubview类中找到UITableViewCellDeleteConfirmationView

foreach (var views in this.Subviews) { if (views.Class.Name.ToString() == new NSString("UITableViewCellDeleteConfirmationView")) { CGRect newFrame = views.Frame; CGRect newframe1 = new CGRect(newFrame.X, 6, newFrame.Size.Width, 59); views.Frame = newframe1; foreach (var getButtonviews in views.Subviews) { Console.WriteLine("x:"+getButtonviews.Frame.X); Console.WriteLine("W:"+getButtonviews.Frame.Width); if (getButtonviews.Class.Name.ToString() == "_UITableViewCellActionButton") { UIImage image = UIImage.FromBundle("img_line"); UIButton button = (UIButton)getButtonviews; UIImageView imageview = new UIImageView(); imageview.Frame = new CGRect(getButtonviews.Frame.X + 120, 0, 1, getButtonviews.Frame.Height); imageview.Image = image; button.AddSubview(imageview); foreach (var getButton in getButtonviews.Subviews) { if (getButton.Class.Name.ToString() == "UIButtonLabel") { UILabel label = (UILabel)getButton; label.Font = UIFont.FromName("ProximaNova-Regular", 13); } } } } } } 

在iOS10之后,tableview中的视图层次结构已更改。

iOS8 - iOS10

UITableView – > UITableViewCell – > UITableViewCellDeleteConfirmationView – > _UITableViewCellActionButton

iOS11

  1. 使用Xcode8

    UITableView – > UITableViewWrapperView – > UISwipeActionPullView – > UISwipeActionStandardButton

  2. 使用Xcode9

    UITableView – > UISwipeActionPullView – > UISwipeActionStandardButton

解:

我让代码在iOS8 – iOS11上工作 ,我将所有代码放在ViewController中的ViewWillLayoutSubviews中,但首先,我们需要知道我们选择哪个单元格。

 public class TableDelegate : UITableViewDelegate { YourViewController owner; public TableDelegate(YourViewController vc){ owner = vc; } public override UITableViewRowAction[] EditActionsForRow(UITableView tableView, NSIndexPath indexPath) { UITableViewRowAction hiButton = UITableViewRowAction.Create( UITableViewRowActionStyle.Default, "Hi", delegate { Console.WriteLine("Hello World!"); }); return new UITableViewRowAction[] { hiButton }; } public override void WillBeginEditing(UITableView tableView, NSIndexPath indexPath) { owner.selectIndexPath = indexPath; owner.View.SetNeedsLayout(); } public override void DidEndEditing(UITableView tableView, NSIndexPath indexPath) { owner.selectIndexPath = null; } } public class TableSource : UITableViewSource { string[] TableItems; string CellIdentifier = "TableCell"; public TableSource(string[] items) { TableItems = items; } public override nint RowsInSection(UITableView tableview, nint section) { return TableItems.Length; } public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) { UITableViewCell cell = tableView.DequeueReusableCell(CellIdentifier); string item = TableItems[indexPath.Row]; //---- if there are no cells to reuse, create a new one if (cell == null) { cell = new UITableViewCell(UITableViewCellStyle.Default, CellIdentifier); } cell.TextLabel.Text = item; return cell; } } public partial class ViewController : UIViewController { protected ViewController(IntPtr handle) : base(handle) { // Note: this .ctor should not contain any initialization logic. } public NSIndexPath selectIndexPath { get; set; } public override void ViewDidLoad() { base.ViewDidLoad(); // Perform any additional setup after loading the view, typically from a nib. string[] tableItems = new string[] { "Vegetables", "Fruits", "Flower Buds", "Legumes", "Bulbs", "Tubers" }; tableview.Source = new TableSource(tableItems); tableview.Delegate = new TableDelegate(this); } public override void ViewWillLayoutSubviews() { base.ViewWillLayoutSubviews(); if (this.selectIndexPath != null) { if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0)) { // Code that uses features from iOS 11.0 and later foreach (UIView subview in tableview.Subviews) { if (subview.Class.Name.ToString() == "UISwipeActionPullView") { foreach (var buttonViews in subview.Subviews) { if (buttonViews.Class.Name.ToString() == "UISwipeActionStandardButton") { //operate what you want. } } } } } else { // Code to support earlier iOS versions UITableViewCell cell = tableview.CellAt(this.selectIndexPath); foreach (UIView subview in cell.Subviews) { if (subview.Class.Name.ToString() == "UITableViewCellDeleteConfirmationView") { foreach (var buttonViews in subview.Subviews) { if (buttonViews.Class.Name.ToString() == "_UITableViewCellActionButton") { //operate what you want. } } } } } } } }