我使用PaintCode将我必须使用的一组SVG转换为Swift代码。看起来它只是将SVG路径转换为UIBezierPath()
s,这很棒。
要显示生成的代码,请执行以下操作:
class FirstImageView: UIView {
init(name: String) { // Irrelevant custom init
super.init(frame: CGRectMake(15, 15, 40, 40)) // 40x40 View
self.opaque = false // Transparent background
}
override func drawRect(rect: CGRect) {
ImagesCollection.firstImage() // Fill the view with this image
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
ImagesCollection.firstImage()
引用的位置:
public class ImagesCollection: NSObject {
public class func firstImage() {
let color4 = UIColor(red: 0.595, green: 0.080, blue: 0.125, alpha: 1.000)
var fill295Path = UIBezierPath()
fill295Path.moveToPoint(CGPointMake(27.5, 2.73))
// Rest of generated graphics code
}
}
哪个效果很好 - 我以40x40生成图形,将帧设置为40x40,并且工作正常。我现在想知道的是,如何以更小(或更大的尺寸)显示相同的图形 - 因为它们应该更好地缩小路径,对吧?将我的视图框架设置为CGRectMake(15, 15, 20, 20)
(对于所需的20x20图像)似乎只是剪切图形。
如何确保在我的视图中绘制的图形大小适合视图的框架?
由于
答案 0 :(得分:2)
您可以使用CGAffineTransform
缩放自定义视图或贝塞尔曲线路径本身。
缩放视图:
myFirstImageView.transform = CGAffineTransformMakeScale(0.5, 0.5)
缩放bezier路径:
// ...
// lots of generated graphics code
fill295Path.applyTransform(CGAffineTransformMakeScale(0.5, 0.5))
fill295Path.stroke() // or fill, etc.
答案 1 :(得分:1)
由于您使用PaintCode生成代码,因此可以在SVG / Bezier周围绘制Frame对象。它将生成具有动态大小的Bezier。在您的示例中,您将获得ImagesCollection.firstImage(#frame: CGRect)
而不是ImagesCollection.firstImage()
。您只需将矩形从drawRect
传递给它即可。
答案 2 :(得分:0)
稍微偏离主题,但根据Nate的要求,我是如何用SVGKit做的:
let svgData: String = "<svg>...</svg>"
let svgParse: SVGKParser = SVGKParser(source: SVGKSource(inputSteam: NSInputStream(data: svgData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)))
svgParse.addDefaultSVGParserExtensions()
var svgImage: SVGKImage = SVGKImage(parsedSVG: svgResult, fromSource: nil)
SVGKFastImageView(SVGKImage: svgImage)