Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 仅将扩展应用于UIButton的某些实例_Ios_Swift - Fatal编程技术网

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按钮应该有自动布局计算它的框架。。。在这一点上,你只是使它圆


这可能并不完全符合您的需要,但这应该是一个良好的开端,只有在您愿意的时候,才可以创建一个精确的round
UIButton

为什么不使用一个显式类来完成您所需的工作呢

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。谢谢!期待着