2014-10-08 21 views
5

Come si fa a tradurre l'ultima riga del seguente codice objC a Swift:Impostazione CIFilter a Swift

CGAffineTransform transform = CGAffineTransformIdentity; 
CIFilter *clampFilter = [CIFilter filterWithName:@"CIAffineClamp"]; 

[clampFilter setValue:[NSValue valueWithBytes:&transform objCType:@encode(CGAffineTransform)] forKey:@"inputTransform"]; 

La seguente riga

clampFilter.setValue(transform, forKey: "inputTransform") 

produce

Type 'CGAffineTransform' does not conform to protocol 'AnyObject' 

risposta

13

NSValue ha un costruttore che accetta un argomento CGAffineTransform:

let transform = CGAffineTransformIdentity 
let clampFilter = CIFilter(name: "CIAffineClamp") 

let val = NSValue(CGAffineTransform: transform) 
clampFilter.setValue(val, forKey: "inputTransform") 

Aggiornamento per Swift 3:

let transform = CGAffineTransform.identity 
let clampFilter = CIFilter(name: "CIAffineClamp")! 
let val = NSValue(cgAffineTransform: transform) 
clampFilter.setValue(val, forKey: "inputTransform") 
+0

Si blocca in Swift 3.1. Puoi pubblicare qualsiasi esempio di CIAffineClamp o CIAffineTile. – ChanWarde

+0

@ChanWarde: Si prega di verificare se l'aggiornamento funziona per voi. –

+0

ciao @ Martin R, non funziona nemmeno "CIKaleidoscope" in TileEffect funziona per me. Tutti gli altri filtri restituiscono un'immagine nulla. Non trovo alcun esempio, domanda o riferimento per questo. Puoi per favore aggiungere del codice. O dovrei aggiungere una nuova domanda per questo ?? – ChanWarde

1

Questo potrebbe fare.

var transform = CGAffineTransformIdentity; 
var clampFilter = CIFilter(name: "CIAffineClamp") 
var value = NSValue(CGAffineTransform: transform) 
clampFilter.setValue(value, forKey: "inputTransform") 
+1

Dovresti sempre usare 'let' in swift a meno che tu non voglia in particolare cambiare il valore in futuro. – Fogmeister