Ios 仅将扩展应用于UIButton的某些实例
我有一个Ios 仅将扩展应用于UIButton的某些实例,ios,swift,Ios,Swift,我有一个ui按钮扩展,使我的一些按钮具有圆形: extension UIButton { override open var intrinsicContentSize: CGSize { let originalContentSize = super.intrinsicContentSize let height = originalContentSize.height + 5 layer.cornerRadius = height / 2
ui按钮
扩展,使我的一些按钮具有圆形:
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
类之前,我的导航栏按钮通常如下所示:
现在,它们看起来是这样的:
这是我不想要的。如何使导航栏按钮恢复到添加扩展之前的样子?将扩展从覆盖更改为静态函数,以便仅在显式实例化一个函数时才会发生:
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
层次结构,它应该很简单。一个类似的地方是viewdilayoutsubviews
,其中实例化的ui按钮应该有自动布局计算它的框架。。。在这一点上,你只是使它圆
这可能并不完全符合您的需要,但这应该是一个良好的开端,只有在您愿意的时候,才可以创建一个精确的roundUIButton
。为什么不使用一个显式类来完成您所需的工作呢
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)
}
}
如果您想为1个按钮执行此操作,则不需要覆盖func,您需要创建新按钮并从要更改的按钮调用它。我正在为5个按钮执行此操作,除此之外,我在导航栏中有3个按钮,我不想对其应用此扩展。创建扩展后,从要编辑的每个按钮调用它,当您在扩展中重写func时,它看起来像myButton1.customContentSize()、myButton2.customContentSize()、myButton3.customContentSize(),它将自动作用于您拥有的所有按钮,在您的情况下,您需要在扩展中创建func。检查这个啊,我相信我明白我错在哪里了,谢谢!谢谢你的回答。我知道你在做什么,如果它不使用框架
,那就太完美了,因为我正在使用自动布局,我的同事告诉我框架和自动布局不应该一起使用。我想知道是否有一种方法可以让我修改你的代码来使用AutoLayout。谢谢!期待着