使用 UIImageView 或 UIView 快速绘图

Posted

技术标签:

【中文标题】使用 UIImageView 或 UIView 快速绘图【英文标题】:Use UIImageView or UIView for drawing in swift 【发布时间】:2017-01-19 08:28:46 【问题描述】:

我的 UITableView 有一个自定义单元格。如果用户为项目选择了一张图片,单元格将显示一张图片:

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

我正在使用绘制代码中的以下代码来制作矩形:

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】:

使用单个UIImageView 并在您的模型上创建一个方法,根据具体情况返回UIImage。当必须绘制图像时,绘制到“图像上下文”中。

我不是一个 swift 作者,所以几乎是 swift...

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
    

Here's an example swift 中的文本属性。

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

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

【讨论】:

以上是关于使用 UIImageView 或 UIView 快速绘图的主要内容,如果未能解决你的问题,请参考以下文章

将 UILabel 粘贴到 UIView 或 UIImageView

如何撤消和/或清除添加到 UIView 的 UIImageView?

UIImageView 填写 UIView

如何在ios目标c的UIImageView中添加UIView

如何逐步显示 UIImageView

调整 uiview 的大小以及 uiimageview 的旋转