如何创建一个自己舍入的UIImageView扩展

时间:2016-05-27 19:10:25

标签: ios swift uiimage

我最近遇到了一个恼人的问题。

假设我想在我的应用程序中的多个位置使用图像,并且在任何地方都必须舍入为圆圈。 因为我希望我的代码干净,所以我认为这个功能(舍入本身)应该放在扩展UIImageView的类里面。 我创建了一个简单的类来覆盖storyboard构造函数,并负责正确设置cornerRadius:

class RoundedImageView: UIImageView {


    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.layer.cornerRadius = self.frame.size.width/2
        self.layer.borderColor = UIColor.redColor().CGColor
        self.layer.borderWidth = 2
        self.layer.masksToBounds = true
    }
}

对于像

这样的约束
  • 宽度:100,
  • 身高:100

    这显然有效,因为在调用构造函数之后框架没有改变(因为它在storyboard中具有正确的尺寸)。例如,当约束看起来像这样时会出现问题:

  • 宽度等于0.5 superview的

  • 宽高比:1:1

因为在调用构造函数后框架会发生变化。

我最终做的是这样的:

override func viewDidLayoutSubviews(){
    super.viewDidLayoutSubviews()
    myRoundedImageInstance.layer.cornerRadius = ...
}

在每个具有此类实例的视图控制器中... ...这是有效的,因为在imageView更改尺寸后重新计算框架,但这是丑陋,并且在这种情况下类的存在似乎

我尝试将frame的重新计算放在drawRect中 - 也不起作用。 有什么想法吗?

2 个答案:

答案 0 :(得分:6)

这是一个简单的IBDesignable示例(您可以在界面构建器中看到它的样子)

@IBDesignable
    class RoundedUIImageView: UIImageView {
        @IBInspectable var round: Bool = true {
            didSet {
                self.clipsToBounds = true
                self.layer.cornerRadius = self.frame.width / 2
                self.layer.borderWidth = 2.5
                self.layer.borderColor = UIColor(rgba: "#D0D0D0").CGColor
            }
        }
    }

你可以使它更复杂,因为这假设UIImageView是一个正方形。如果它不是,它将最终成为一个椭圆。您可以计算最小尺寸,然后剪切。但这是你想要做的最简单的形式。

编辑:同样的想法,但代码更精致。

import UIKit

@IBDesignable
class RoundedUIImageView: UIImageView {
    @IBInspectable var round: Bool = true {
        didSet { self.setNeedsLayout() }
    }

    @IBInspectable var width: CGFloat = 2.5 {
        didSet { self.setNeedsLayout() }
    }

    @IBInspectable var color: UIColor = UIColor(rgba: "#D0D0D0") {
        didSet { self.setNeedsLayout() }
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.clipsToBounds = true

        if round {
            self.layer.cornerRadius = self.frame.width / 2
        } else {
            self.layer.cornerRadius = 0
        }

        self.layer.borderWidth = self.width
        self.layer.borderColor = self.color.CGColor
    }
}

它有默认值,所以一切都可以保持一致。但它也可以通过故事板进行定制。

答案 1 :(得分:1)

您可以将圈子更新代码移到layoutSubviews方法中。