2015-02-13 3 views
3

Я хочу создать приложение, в котором пользователь может рисовать на экране, а затем сохранять свои рисунки. Ниже мой UIView Жеребьевка код:Как сохранить чертеж CoreGraphics в Swift

import UIKit 

class DrawView: UIView { 


    var lines: [Line] = [] // Line is a custom class, shown below 
    var lastPoint: CGPoint! 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
     lastPoint = touches.anyObject()?.locationInView(self) 
    } 

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) { 
     var newPoint = touches.anyObject()?.locationInView(self) 
     lines.append(Line(start: lastPoint, end: newPoint!)) 
     lastPoint = newPoint 
     self.setNeedsDisplay() 
    } 

    override func drawRect(rect: CGRect) { 
     var context = UIGraphicsGetCurrentContext() 
     CGContextBeginPath(context) 
     CGContextSetLineCap(context, kCGLineCapRound) 
     for line in lines { 
      CGContextMoveToPoint(context, line.start.x, line.start.y) 
      CGContextAddLineToPoint(context, line.end.x, line.end.y) 
     } 
     CGContextSetRGBStrokeColor(context, 0, 0, 0, 1) 

     CGContextSetLineWidth(context, 5) 
     CGContextStrokePath(context) 
    } 
} 

Код для класса Line:

import UIKit 

class Line { 

    var start: CGPoint 
    var end: CGPoint 

    init(start _start: CGPoint, end _end: CGPoint) { 
     start = _start 
     end = _end 

    } 
} 

Теперь я хочу, чтобы иметь возможность сохранить этот рисунок, используя NSUserDefaults. Как мне это сделать?

ответ

3

Чтобы захватить вид, вы можете использовать UIGraphicsBeginImageContextWithOptions и drawViewHierarchyInRect:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0) 
view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 
let image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Чтобы сохранить его в NSUserDefaults, вы можете:

let data = UIImagePNGRepresentation(image) 
let userDefaults = NSUserDefaults.standardUserDefaults() 
userDefaults.setObject(data, forKey: "snapshot") 
userDefaults.synchronize() 

Чтобы извлечь его из NSUserDefaults, вы могли бы :

if let data = NSUserDefaults.standardUserDefaults().dataForKey("snapshot"), let image = UIImage(data: data) { 
    // do something with image 
} 

Лично я не был бы склонен хранить изображения в NSUserDefaults. Я бы сохранил его в постоянном хранилище. Например, чтобы сохранить его в папку Документы вы можете:

do { 
    let documentsURL = try NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) 
    let fileURL = documentsURL.URLByAppendingPathComponent("test.png") 

    try data.writeToURL(fileURL, options: .AtomicWrite) 
} catch { 
    print(error) 
} 
+0

Спасибо! Большая помощь. – brimstone

2
//I would recomend you to save line on touches end 
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { 

     save() 
    } 

    func save() { 

     var data : NSMutableData=NSMutableData() 

     var archiver=NSKeyedArchiver(forWritingWithMutableData: data) 
     archiver.encodeObject(lines, forKey:"classLine") 
     archiver.finishEncoding() 

     NSUserDefaults.standardUserDefaults().setObject(data, forKey: "shape") 
    } 


    class func loadSaved() { 
     if let data = NSUserDefaults.standardUserDefaults().objectForKey("shape") as? NSData { 

      var unarchiver :NSKeyedUnarchiver = NSKeyedUnarchiver(forReadingWithData: data); 

      var line : Line = unarchiver.decodeObjectForKey("classLine") as Line! 

     } 

    } 



} 


class Line : NSObject { 

    var start: CGPoint 
    var end: CGPoint 

    init(start _start: CGPoint, end _end: CGPoint) { 
     start = _start 
     end = _end 

    } 

    func encodeWithCoder(aCoder: NSCoder) { 

      aCoder.encodeCGPoint(start, forKey: "start") 
      aCoder.encodeCGPoint(end, forKey: "end") 

    } 

    required init(coder aDecoder: NSCoder) { 

     start = aDecoder.decodeCGPointForKey("start") 
     end = aDecoder.decodeCGPointForKey("end") 


} 
} 
+0

Спасибо! Большая помощь! – brimstone

+0

Вы приветствуете, что я сделал некоторое обновление, попробуйте, пусть mw знает, если у вас возникнут какие-либо проблемы. – Shashi3456643

+0

Спасибо @Rob Перед NSKeyedArchiving Необходимо закодировать, а также перед распаковкой необходимо декодировать. Мне понравился ваш ответ, сохраняющий файл PNG и возвращающий файл PNG. – Shashi3456643

Смежные вопросы