首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只对UIButton的某些实例应用扩展

只对UIButton的某些实例应用扩展
EN

Stack Overflow用户
提问于 2018-11-08 17:38:46
回答 2查看 189关注 0票数 0

我有一个UIButton扩展,使我的一些按钮具有圆形:

代码语言:javascript
复制
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)
    }
}

这与我的视图中的按钮的工作原理一样。然而,我的导航条中也有一些按钮,这些按钮受到了这个扩展的影响,现在显示在它们的容器中,带有额外的填充,这是非常难看的。

我通常是这样创建导航栏按钮的:

代码语言:javascript
复制
private func navBarButton() -> UIBarButtonItem {
    let button = UIBarButtonItem(image: UIImage(named: "x"), style: .plain, target: self, action: #selector(x))
    button.tintColor = .black
    return button
}

在将扩展添加到UIButton类之前,我的导航条按钮通常如下所示:

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

这是我不想要的。在添加扩展之前,我如何使肚脐按钮恢复到原来的样子呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-08 20:40:44

将扩展从覆盖更改为静态函数,这样只有在显式实例化扩展时才会发生:

代码语言:javascript
复制
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
    }
}

用法:

代码语言:javascript
复制
let myButton = UIButton.createAsRound(size: CGSize(width: 40, height: 40))

编辑如果您正在使用自动布局:

在扩展部分中,添加“createAsRound`”

代码语言:javascript
复制
button.translatesAutoresizingMaskIntoConstraints = false

然后添加另一个只能根据需要调用的方法:

代码语言:javascript
复制
func makeRound() {
    button.layer.cornerRadius = self.frame.height/2
    self.setNeedsDisplay()
}

此编辑是未经测试的代码。我会根据需要编辑。(我多次使用的第一段代码和自动布局)。

显然,要添加的一行代码实际上只是一种方便。一旦设置了自动掩码标志,您就告诉iOS使用自动布局。设置“框架”与设置显式原点/大小约束--特别是如果使用布局锚可以在扩展中完成,只要您已经实例化了按钮的superview。

动态改变大小?一旦您收集了UIViewController层次结构,它应该是简单的。一个类似的地方是viewDidLayoutSubviews,实例化的UIButton应该有自动布局计算它的帧.在那一刻你只会让它转过来。

这可能不完全适合您的需求,但它应该是一个良好的开端,正是创建一个圆UIButton时,您想要。

票数 1
EN

Stack Overflow用户

发布于 2018-11-08 22:18:25

为什么不使用一个显式类来完成您所需要的任务呢?

代码语言:javascript
复制
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)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53213301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档