2017-03-26 6 views
0

Tout comme le titre, j'ai un code Objective-c, comment puis-je les utiliser dans swift3Comment puis-je convertir le code suivant à propos CGContext dans swift3

CGContextSaveGState(context); 
CGContextSetTextMatrix(context, CGAffineTransformIdentity); 
CGContextTranslateCTM(context, 0, size.height); 
CGContextScaleCTM(context, 1.0, -1.0); 

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddRect(path, NULL, CGRectMake(0, 0, size.width, size.height)); 
NSMutableAttributedString *attri = [[NSMutableAttributedString alloc]initWithString:_text]; 
[attri addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:10] range:NSMakeRange(0, _text.length)]; 

CTFramesetterRef ctFramesetting = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attri); 
CTFrameRef ctFrame = CTFramesetterCreateFrame(ctFramesetting, CFRangeMake(0, attri.length), path, NULL); 
CTFrameDraw(ctFrame, context); 

CFRelease(path); 
CFRelease(ctFramesetting); 
CFRelease(ctFrame); 

Répondre

-1

Vous pouvez utiliser quelque chose comme le Objective-C to Swift Converter pour obtenir code comme le suivant:

context.saveGState() 
context.textMatrix = CGAffineTransform.identity 
context.translateBy(x: 0, y: size.height) 
context.scaleBy(x: 1.0, y: -1.0) 
var path: CGMutablePathRef = CGMutablePath() 
path.addRect(CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(size.width), height: CGFloat(size.height)), transform: .identity) 
var attri = NSMutableAttributedString(string: _text) 
attri.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: CGFloat(10)), range: NSRange(location: 0, length: _text.length)) 
var ctFramesetting: CTFramesetterRef? = CTFramesetterCreateWithAttributedString((attri as? CFAttributedStringRef)) 
var ctFrame: CTFrameRef = CTFramesetterCreateFrame(ctFramesetting, CFRangeMake(0, attri.length), path, nil) 
CTFrameDraw(ctFrame, context) 

Mais je suggère que vous n'apprendre les principes sous-jacents à la fois Objective-C et Swift afin que vous puissiez faire ce genre de vous-même la conversion au lieu de compter sur les autres ou un outil externe:)

Par exemple, ce qui précède est le code tel qu'il est sorti du convertisseur. Toutefois, si vous deviez faire un peu de nettoyage, il ressemblerait à quelque chose comme ceci:

guard let context = UIGraphicsGetCurrentContext() else { 
    return 
} 
context.saveGState() 
context.textMatrix = CGAffineTransform.identity 
context.translateBy(x: 0, y: size.height) 
context.scaleBy(x:1.0, y: -1.0) 
let path = CGMutablePath() 
path.addRect(CGRect(x:0, y:0, width:size.width, height:size.height), transform:.identity) 
let attri = NSMutableAttributedString(string:_text as String) 
attri.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize:10), range: NSRange(location: 0, length:_text.length)) 
let ctFramesetting = CTFramesetterCreateWithAttributedString(attri) 
let ctFrame = CTFramesetterCreateFrame(ctFramesetting, CFRangeMake(0, attri.length), path, nil) 
CTFrameDraw(ctFrame, context) 

Comme vous remarquerez les éléments suivants doit être ajouté pour obtenir une instance CGContext:

guard let context = UIGraphicsGetCurrentContext() else { 
    return 
} 

également , certaines variables marquées comme mutables (ou var) ont été remplacées par des instances immuables (ou let).

Mais ce n'est pas tout ce qu'il y a à faire. Le code ci-dessus suppose que _text est de type NSString. Pour utiliser les types natifs Swift, vous devez vraiment le modifier pour utiliser String au lieu de NSString. Ensuite, les changements de code à:

guard let context = UIGraphicsGetCurrentContext() else { 
    return 
} 
context.saveGState() 
context.textMatrix = CGAffineTransform.identity 
context.translateBy(x: 0, y: size.height) 
context.scaleBy(x:1.0, y: -1.0) 
let path = CGMutablePath() 
path.addRect(CGRect(x:0, y:0, width:size.width, height:size.height), transform:.identity) 
let attri = NSMutableAttributedString(string:_text) 
attri.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize:10), range: NSRange(location: 0, length:_text.characters.count)) 
let ctFramesetting = CTFramesetterCreateWithAttributedString(attri) 
let ctFrame = CTFramesetterCreateFrame(ctFramesetting, CFRangeMake(0, attri.length), path, nil) 
CTFrameDraw(ctFrame, context) 

Ainsi, afin de convertir le code Swift 3 et pour le faire fonctionner, vous avez besoin de comprendre les différences entre Swift et Objective-C.

+0

merci beaucoup, je vais prendre votre avis – BaQiWL

+0

@BaQiWL vous devez utiliser des convertisseurs SEULEMENT si votre confiant et corrigera toutes les inexactitudes de la sortie du convertisseur. C'est globalement une mauvaise pratique.En plus de cela, vous allez grandir plus vite et écrire un meilleur code si vous l'écrivez ligne par ligne et comprenez ce qui se passe vraiment –

+0

@OlehZayats Si vous lisez mon commentaire après la conversion, je lui ai conseillé d'apprendre à le faire sur son propre aussi bien :) Mais si vous connaissez à la fois Objective-C et Swift, un convertisseur fait le travail de grognement pour vous - aussi longtemps que vous savez comment réparer des choses après. – Fahim

0

est ici une version Swift 3 propre:

context.saveGState() 
context.textMatrix = CGAffineTransform.identity 
context.translateBy(x: 0, y: size.height) 
context.scaleBy(x: 1.0, y: -1.0) 

let path = CGMutablePath() 
let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height) 
path.addRect(rect, transform: .identity) 

let attrString = NSMutableAttributedString(string: _text as String) 
attrString.addAttribute(NSFontAttributeName, 
         value: UIFont.systemFont(ofSize: 10.0), 
         range: NSRange(location: 0, 
             length: _text.length)) 

let ctFramesetting = CTFramesetterCreateWithAttributedString(attrString) 
let ctFrame = CTFramesetterCreateFrame(ctFramesetting, 
             CFRangeMake(0, attrString.length), 
             path, 
             nil) 
CTFrameDraw(ctFrame, context) 

Je vous conseille de ne pas utiliser convertisseurs.

Pourquoi? Avec convertisseurs vous

  • probablement utiliser des variables où vous avez besoin des constantes
  • pont/cast valeurs que
  • explicitement déballez optionals
  • rupture de style Swift (cela dépend de ce style que vous utilisez réellement, mais encore)
  • conventions linguistiques break

cela signifie que vous aurez un code stable/sale que vous devez refactor

+1

en parlant de style, vous devriez probablement garder une certaine cohérence. 'et' y' dans 'CGRect', vous devriez aussi l'utiliser après' width', de même pour 'transform'. , la même chose que nous faisons avec des blocs – Sulthan

+0

@Sulthan merci! Je ne peux pas être en désaccord –