iOS 11 中的 UITableViewRowAction 太宽

Posted

技术标签:

【中文标题】iOS 11 中的 UITableViewRowAction 太宽【英文标题】:UITableViewRowAction is too wide in iOS 11 【发布时间】:2017-09-14 05:21:20 【问题描述】:

我使用以下技巧在表格视图行操作中添加图像:

How to manage equal width for UITableViewRowAction in ios8.0?(More,Delete,etc actions)

UITableViewRowAction *completeAction = [UITableViewRowAction
                                        rowActionWithStyle:UITableViewRowActionStyleNormal
                                        title:@"   "
                                        handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) 
                                            ...
                                        ];
completeAction.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"MyImageHere"]];

但它不再适用于 iOS 11 - 行操作按钮的宽度对于我的图像来说太大了,所以它重复了:

有解决办法吗?

更新:

我最终使用了 iOS 11 中引入的新的尾随/前导上下文操作 API:

https://developer.apple.com/documentation/uikit/uicontextualaction

此 API 允许您在动作中使用图像等等。

#if defined __IPHONE_11_0 && __has_builtin(__builtin_available)

// This will be called on iOS 11+ if compiling with Xcode 9.

- (id)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath 
    if (@available(iOS 11.0, *)) 
        UISwipeActionsConfiguration *configuration = ...
        return configuration;
    
    return nil;


#endif

// This will be called on iOS 10 and older.

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView
                  editActionsForRowAtIndexPath:(NSIndexPath *)indexPath 
    // Old style row actions.

请注意,如果您使用 Xcode 8 编译这样的代码,则不会定义新的委托方法(您会看到错误)。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,并且能够解决它。但是,我的解决方案很老套,需要一些解释:

我们必须实现一个自己的UITableView,它会在LayoutSubviews()中修改它的子视图和子视图的布局。 包含操作按钮的视图是 UISwipeActionPullView 并且是子视图。这种类型在编译时不可用(也许有人知道如何检查这种类型?),但我们可以检查类型 UIKit.UIView 并检查视图是否具有相同数量的子视图( UIButton),因为我们定义了操作按钮。

我们希望避免我们的子视图变得比操作按钮的宽度总和更宽。在这种情况下,我们需要修复 UISwipeActionPullView 的大小和位置。此外,我们需要修复 UIButton 的位置。

我的代码给出了三个固定宽度操作按钮的示例:

class CustomTableView: UITableView

    public CustomTableView(CGRect frame, UITableViewStyle style) : base(frame, style)
    
    

    public override void LayoutSubviews()
    
        base.LayoutSubviews();
        var buttonSize = 54;

        foreach (var actionView in Subviews)
        
            if (actionView.GetType().FullName == "UIKit.UIView" && actionView.Subviews.Length == 3)
            
                if (actionView.Frame.Width >= buttonSize* 3)
                
                    actionView.Frame = new CGRect(Frame.Width - 3 * buttonSize, actionView.Frame.Y, buttonSize* 3, buttonSize);
                    int i = 0;
                    foreach (var button in actionView.Subviews)
                    
                        button.Frame = new CGRect(i * buttonSize, 0, buttonSize, buttonSize);
                        i++;
                    
                
            
        
    

【讨论】:

以上是关于iOS 11 中的 UITableViewRowAction 太宽的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 中的推送通知

iOS 11 中的横向 UITabBar 中的 UITabBarItem

UISearchBar在iOS 11中的错误位置

iOS 11.3 的 WKWebView 中的 Service Worker 不可用

导航栏中的 UIButton 无法识别 iOS 11 中的点击

iOS 11 上 UITableView 中的 UISearchController 问题