我有一个UIButton扩展,使我的一些按钮具有圆形:
extension UIButton {
override open var intrinsicContentSize: CGSize {
let originalContentSize = super.intrinsicContentSize
let height = originalContentSize.height + 5
layer.cornerRadius = height / 2
layer.masksToBounds = true
return CGSize(width: originalContentSize.width + 35, height: height)
}
}这与我的视图中的按钮的工作原理一样。然而,我的导航条中也有一些按钮,这些按钮受到了这个扩展的影响,现在显示在它们的容器中,带有额外的填充,这是非常难看的。
我通常是这样创建导航栏按钮的:
private func navBarButton() -> UIBarButtonItem {
let button = UIBarButtonItem(image: UIImage(named: "x"), style: .plain, target: self, action: #selector(x))
button.tintColor = .black
return button
}在将扩展添加到UIButton类之前,我的导航条按钮通常如下所示:

现在,它们看起来像这样:

这是我不想要的。在添加扩展之前,我如何使肚脐按钮恢复到原来的样子呢?
发布于 2018-11-08 20:40:44
将扩展从覆盖更改为静态函数,这样只有在显式实例化扩展时才会发生:
extension UIButton {
static func createAsRound(size: CGSize) -> UIButton {
let button = UIButton(type: .system)
button.frame = CGRect(origin: CGPoint.zero, size: size)
button.layer.cornerRadius = size.height/2
button.layer.masksToBounds = true
return button
}
}用法:
let myButton = UIButton.createAsRound(size: CGSize(width: 40, height: 40))编辑如果您正在使用自动布局:
在扩展部分中,添加“createAsRound`”
button.translatesAutoresizingMaskIntoConstraints = false然后添加另一个只能根据需要调用的方法:
func makeRound() {
button.layer.cornerRadius = self.frame.height/2
self.setNeedsDisplay()
}此编辑是未经测试的代码。我会根据需要编辑。(我多次使用的第一段代码和自动布局)。
显然,要添加的一行代码实际上只是一种方便。一旦设置了自动掩码标志,您就告诉iOS使用自动布局。设置“框架”与设置显式原点/大小约束--特别是如果使用布局锚可以在扩展中完成,只要您已经实例化了按钮的superview。
动态改变大小?一旦您收集了UIViewController层次结构,它应该是简单的。一个类似的地方是viewDidLayoutSubviews,实例化的UIButton应该有自动布局计算它的帧.在那一刻你只会让它转过来。
这可能不完全适合您的需求,但它应该是一个良好的开端,正是创建一个圆UIButton时,您想要。
发布于 2018-11-08 22:18:25
为什么不使用一个显式类来完成您所需要的任务呢?
class RoundedButton: UIButton {
open override var intrinsicContentSize: CGSize {
let originalContentSize = self.intrinsicContentSize
let height = originalContentSize.height + 5
layer.cornerRadius = height / 2
layer.masksToBounds = true
return CGSize(width: originalContentSize.width + 35, height: height)
}
}https://stackoverflow.com/questions/53213301
复制相似问题