ios 为UITableView滑动操作设置自定义字体(UIContextualAction)

fdbelqdn  于 2023-06-25  发布在  iOS
关注(0)|答案(5)|浏览(197)

如何在UIContextualAction中为标题设置自定义字体?
我试过UIAppearance,但没有任何运气。
Cheers!:)

mkshixfv

mkshixfv1#

我已经找到了一种方法来做到这一点,通过使用图像属性,而不是标题。。

标准字体(删除/重命名)

自定义字体(删除/重命名)

要创建标签的图像,我有以下扩展名:

extension UIImage {

    /// This method creates an image of a view
    convenience init?(view: UIView) {

        // Based on https://stackoverflow.com/a/41288197/1118398
        let renderer = UIGraphicsImageRenderer(bounds: view.bounds)
        let image = renderer.image { rendererContext in
            view.layer.render(in: rendererContext.cgContext)
        }

        if let cgImage = image.cgImage {
            self.init(cgImage: cgImage, scale: UIScreen.main.scale, orientation: .up)
        } else {
            return nil
        }
    }
}

然后我简单地有:

override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {

    let action = UIContextualAction(style: .destructive, title: nil) { action, view, completion in
        // Your swipe action code!
    }
    let label = UILabel()
    label.text = // Your swipe action text!
    label.font = // Your custom font!
    label.sizeToFit()
    action.image = UIImage(view: label)

    return UISwipeActionsConfiguration(actions: [action])
}
8ftvxx2r

8ftvxx2r2#

我最近发现了一种方法,通过使用button titleLabel代替image属性来实现这一点,这样您就可以保留对文本和图像进行操作的能力。
如你所见,我们需要做些尴尬的事…

func tableView(_ tableView: UITableView, willBeginEditingRowAt indexPath: IndexPath) {

    if #available(iOS 13.0, *) {
        for subview in tableView.subviews {
            if NSStringFromClass(type(of: subview)) == "_UITableViewCellSwipeContainerView" {
                for swipeContainerSubview in subview.subviews {
                    if NSStringFromClass(type(of: swipeContainerSubview)) == "UISwipeActionPullView" {
                        for case let button as UIButton in swipeContainerSubview.subviews {
                            button.titleLabel?.font = .systemFont(ofSize: 12)
                        }
                    }
                }
            }
        }
    } else {
        for subview in tableView.subviews {
            if NSStringFromClass(type(of: subview)) == "UISwipeActionPullView" {
                for case let button as UIButton in subview.subviews {
                    button.titleLabel?.font = .systemFont(ofSize: 12)
                }
            }
        }
    }
 }
amrnrhlw

amrnrhlw3#

Swift 5和iOS 13更新

以下函数允许您为滑动操作设置字体和色调。
要开始使用,请将扩展添加到UITableView

extension UITableView {
    /// Iterates over all subviews of a `UITableView` instance and applies the supplied font to all labels withing the UISwipeAction's array.
    /// - Parameter font: The font that should be applied to the labels.
    /// - Parameter tintColor: The tint color that should be applied to image views and labels
    /// - Parameter ignoreFirst: Whether or not the first swipe action should be ignored when applying tints
    public func setSwipeActionFont(_ font: UIFont, withTintColor tintColor: UIColor? = nil, andIgnoreFirst ignoreFirst: Bool = false) {
        for subview in self.subviews {
            //Confirm that the view being touched is within a swipe container
            guard NSStringFromClass(type(of: subview)) == "_UITableViewCellSwipeContainerView" else {
                continue
            }

            //Re-iterate subviews and confirm that we are touching a swipe view
            for swipeContainerSubview in subview.subviews {
                guard NSStringFromClass(type(of: swipeContainerSubview)) == "UISwipeActionPullView" else {
                    continue
                }

                //Enumerate subviews and confirm that we are touching a button
                for (index, view) in swipeContainerSubview.subviews.filter({ $0 is UIButton }).enumerated() {
                    //Set Font
                    guard let button = view as? UIButton else {
                        continue
                    }
                    button.titleLabel?.font = font
                    
                    //Set Tint Conditionally (based on index)
                    guard index > 0 || !ignoreFirst else {
                        continue
                    }
                    button.setTitleColor(tintColor, for: .normal)
                    button.imageView?.tintColor = tintColor
                }
            }
        }
    }
}

在委托中,将以下功能添加到UITableViewDataSource.WillBeginEditing(UITableView, IndexPath)方法中。根据需要替换字体和颜色参数。颜色是可选的。

self?.tableView.setSwipeActionFont(.systemFont(ofSize: 24.0, withTintColor: .systemRed)
w7t8yxp5

w7t8yxp54#

我发现了一个非常简单的方法,帮助我所有你要做的就是创建自己的视图,并添加一个标签,图像或任何你想要的
从表面上定制这个视图中的所有内容,然后使用下面的代码将其转换为图像接下来,将图像添加到操作按钮,就这样了
deleteAction.image = createDeleteImage()///这是我的函数,它创建了一个视图,然后使用下面的扩展名,它将其转换为一个图像
在执行此操作之前,不要忘记使按钮的标题等于空字符串“”

extension UIView {

    // Using a function since `var image` might conflict with an existing variable
    // (like on `UIImageView`)
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

How to convert a UIView to an image

tzcvj98z

tzcvj98z5#

对于目标C

创建方法

- (UIImage *)createImageFromLabel:(UILabel *)label
{
    UIGraphicsBeginImageContext(label.bounds.size);

    [label.layer renderInContext:UIGraphicsGetCurrentContext()];;

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

    return image;
}

此方法将从标签返回图像。
现在在tableview数据源方法中

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIContextualAction *action = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:nil handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
        
        //Your code here
    }];

    action.backgroundColor = [UIColor redColor];

    // Create label as you want view for delete button
    UILabel *label = [[UILabel alloc] init];
    label.font = [UIFont systemFontSize:14];
    label.text = @"Your Text";
    label.textColor = [UIColor whiteColor];
    [label sizeToFit];
    UIImage *image =  [self createImageFromLabel:label];

    action.image = image;

    UISwipeActionsConfiguration *actions = [UISwipeActionsConfiguration configurationWithActions:@[action]];

    return actions;
}

相关问题