ios 当UIButton.Configuration.showsActivityIndicator为true和false时,确保按钮高度一致

chy5wohz  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(91)

在下面的代码中,当使用默认的大动态类型大小时,按钮高度为28.33。当您点击按钮以启用showsActivityIndicator时,高度意外地增加到34.33。字体大小越小,用户的动态类型大小越大,按钮高度不一致的情况就越明显。

let button = UIButton(configuration: {
    var config = UIButton.Configuration.filled()
    config.title = "Button"
    config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer {
        var container = $0
        container.uiKit.font = .preferredFont(forTextStyle: .caption1)
        return container
    }
    return config
}())
button.addAction(UIAction() { _ in
    button.configuration?.showsActivityIndicator = true
}, for: .touchUpInside)

字符串
问题似乎是按钮的高度是由内容插入决定的,而这些插入是相对于按钮中最大的内容的。最初按钮中唯一的内容是标题文本,所以它的高度很小,然后添加了活动指示符,它的高度比标题文本大,因此,按钮高度增加,以确保内容插入相对于最高的内容得到尊重。是否有一种方法可以解决这个问题,使按钮高度在其非-加载和加载状态(除了强制固定高度约束)?也许有一种方法可以改变内容插入,使其始终相对于非加载状态下的活动指示器高度?

xa9qqrwz

xa9qqrwz1#

有一个选择可能对你有用
Apple的Docs:

    • showsActivityIndicator**

一个布尔值,用于确定按钮是否显示活动指示器而不是图像。
"微调器"的默认大小在@2x显示器上为20.5 x 20.5,在@3x显示器上为20.333... x 20.333...
因此,我们可以将清晰的图像设置为该大小,并调整.contentInsets,以便在活动指示器不显示时标题水平居中。
就像这样:

let v: CGFloat = 20.0 + 1.0 / UIScreen.main.scale
// create a clear image
let img = UIGraphicsImageRenderer(size: .init(width: v, height: v)).image { _ in }
let button = UIButton(configuration: {
    var config = UIButton.Configuration.filled()
    config.title = "Button"
    config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer {
        var container = $0
        container.uiKit.font = .preferredFont(forTextStyle: .caption1)
        return container
    }
    config.image = img
    // default instets are 7, 12, 7, 12
    //  so we need to add the image width to the right
    config.contentInsets = .init(top: 7.0, leading: 12.0, bottom: 7.0, trailing: 12.0 + v)
    return config
}())

button.addAction(UIAction() { _ in
    button.configuration?.showsActivityIndicator.toggle()
}, for: .touchUpInside)

字符串

    • 编辑**

似乎没有任何属性可以设置为给予您所需的控件.
你可以使用上面的代码(清晰的图像),并在属性更改时更新图像。
或者--一种"蛮力"的解决方法,同样,* 可能 * 适合你:
创建一个按钮(具有匹配的属性),隐藏或定位在视图外部,并设置其config.showsActivityIndicator = true.然后将visible按钮的Height约束为nonvisible按钮的Height。

相关问题