使用UIImageView或UIView进行快速绘制

时间:2017-01-19 08:28:46

标签: ios swift uiview uiimageview

我的UITableView有一个自定义单元格。如果用户为项目单元格选择了图片,则会显示图片: enter image description here

如果没有,我将显示项目名称的前两个字符: enter image description here

我正在使用以下代码来绘制颜色:

public class CircleStyleKit : NSObject {

    //// Drawing Methods

    public dynamic class func drawCanvas1(frame targetFrame: CGRect = CGRect(x: 0, y: 0, width: 38, height: 38), resizing: ResizingBehavior = .aspectFit, circleLable: String = "DR", circleSize: CGSize = CGSize(width: 38, height: 38), textSize: CGFloat = 17) {
        //// General Declarations
        let context = UIGraphicsGetCurrentContext()!

        //// Resize to Target Frame
        context.saveGState()
        let resizedFrame: CGRect = resizing.apply(rect: CGRect(x: 0, y: 0, width: 38, height: 38), target: targetFrame)
        context.translateBy(x: resizedFrame.minX, y: resizedFrame.minY)
        context.scaleBy(x: resizedFrame.width / 38, y: resizedFrame.height / 38)
} // It's too long 

我展示了部分代码,因为它太长了。

然后我使用UIView绘制这个矩形:

import UIKit

class CirclyStyleView: UIView {

    override func draw(_ rect: CGRect) {
       CircleStyleKit.drawCanvas1()
        }

    }

}
  

有两个问题:

     

首先,如果我在故事板中使用UIImageView,我就可以绘制图像了   而且我不知道我是否可以用我的代码绘制一个矩形。但是,我   检查它不起作用。

     

第二,如果我使用UIView,我可以绘制一个矩形,但如果我想绘制一个图像,我应该使用UIColor(patternImage: UIImage(named: "picName")!),但我不能像我为图像视图那样改变这个图像框。例如,按照我在图片中显示的那样圈出来。

     

问题是,我可以使用UIImageView,有没有办法在UIImageView中制作我的矩形   或者我可以使用UIView,有没有办法设置我的自定义图像。我的意思是改变图像大小和帧。

1 个答案:

答案 0 :(得分:2)

使用单个UIImageView并在模型上创建一个方法,根据其情况返回UIImage。必须绘制图像时,请绘制到"图像上下文"。

我不是一个快速的作者,所以几乎是快速的......

func imageForThisItem(item : AnyObject) -> UIImage {
    // not really "AnyObject", use the object type in your data source array
    // even better, make this a method on that model object 

    if (/* item has an image, like the sailboat */) {
        return UIImage(named:"SailboatImage")  // or however you got the sailboat image
    } else {
        // initialize "size" to be the same size as the sailboat images
        UIGraphicsBeginImageContextWithOptions(size, false, 0)

        // do your circle and text drawing here within the rect (0,0,size.width,size.height)
        UIColor.greenColor().setFill()
        let bezier = UIBezierPath(rect : rect)
        bezier.fill()

        let initials = item.initials() // however you get this
        // even better, if this is a model method, then self.initials()

        let attributes = // an attribute dictionary, see link below
        initials.drawInRect(rect, withAttributes: attributes)
        // or use CGOffsetRect to provide a little margin

        var image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}
swift中的

Here's an example文本属性。

在模型上使用此方法的另一个重要原因是您应该缓存此方法的结果,这样您就不必每次都计算它。懒惰的初始化模式非常适合这种情况。

lazy var imageForThisItem: [UIImage] = {
    // code as above, using "self" rather than item
}()