2016-04-29 4 views
0

Я читаю GCD учебник из этого https://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1.CIFeature не имеет члена hasLeftEyePosition

Когда я загружаю начатый проект, и строить, я получил ошибку:

private extension PhotoDetailViewController { 
    func faceOverlayImageFromImage(image: UIImage) -> UIImage { 
    let detector = CIDetector(ofType: CIDetectorTypeFace, 
        context: nil, 
        options: [CIDetectorAccuracy: CIDetectorAccuracyHigh]) 

    // Get features from the image 
    let newImage = CIImage(CGImage: image.CGImage!) 
    let features = detector.featuresInImage(newImage) 

    UIGraphicsBeginImageContext(image.size) 
    let imageRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) 

    // Draws this in the upper left coordinate system 
    image.drawInRect(imageRect, blendMode: CGBlendMode.Normal, alpha: 1.0) 

    let context = UIGraphicsGetCurrentContext() 
    for faceFeature in features { 
     let faceRect = faceFeature.bounds 
     CGContextSaveGState(context) 

     // CI and CG work in different coordinate systems, we should translate to 
     // the correct one so we don't get mixed up when calculating the face position. 
     CGContextTranslateCTM(context, 0.0, imageRect.size.height) 
     CGContextScaleCTM(context, 1.0, -1.0) 

     if faceFeature.hasLeftEyePosition { 
     let leftEyePosition = faceFeature.leftEyePosition 
     let eyeWidth = faceRect.size.width/FaceBoundsToEyeScaleFactor 
     let eyeHeight = faceRect.size.height/FaceBoundsToEyeScaleFactor 
     let eyeRect = CGRect(x: leftEyePosition.x - eyeWidth/2.0, 
      y: leftEyePosition.y - eyeHeight/2.0, 
      width: eyeWidth, 
      height: eyeHeight) 
     drawEyeBallForFrame(eyeRect) 
     } 

     if faceFeature.hasRightEyePosition { 
     let leftEyePosition = faceFeature.rightEyePosition 
     let eyeWidth = faceRect.size.width/FaceBoundsToEyeScaleFactor 
     let eyeHeight = faceRect.size.height/FaceBoundsToEyeScaleFactor 
     let eyeRect = CGRect(x: leftEyePosition.x - eyeWidth/2.0, 
      y: leftEyePosition.y - eyeHeight/2.0, 
      width: eyeWidth, 
      height: eyeHeight) 
     drawEyeBallForFrame(eyeRect) 
     } 

     CGContextRestoreGState(context); 
    } 

    let overlayImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return overlayImage 
    } 

На этой линии faceFeature.hasLeftEyePosition, он говорит:

Value of type 'CIFeature' has no member 'hasLeftEyePosition'

Так как решить эту проблему.

Любая помощь будет оценена по достоинству. Благодарю.

+0

Только [ 'CIFaceFeature'] (HTTPS: //developer.apple.com/library/ios/documentation/CoreImage/Reference/CIFaceFeature/index.html#//apple_ref/occ/cl/CIFaceFeature) обладает таким свойством. Вам нужно бросить его. – HAS

ответ

1

Я только что загрузил проект, на который вы ссылались, и он работает для меня (после обновления его до последней версии Swift).

важная часть вам не хватает в вашей 9-й линии, где вы установили features:

let features = detector.featuresInImage(newImage) 

Это должно быть

let features = detector.featuresInImage(newImage) as! [CIFaceFeature] 

Я сильно я против литья силы, но так как это не производственное приложение, я в порядке с ним. Если вы хотите, чтобы убедиться, что вы никогда не сломается (в случае, если кто-то меняет CIDetectorType от «лица» на что-то другое), вы можете защитить его и вернуть входное изображение вместо:

guard let features = detector.featuresInImage(newImage) as? [CIFaceFeature] else { return image } 
+0

не работает. Когда я изменяюсь так, как вы, он говорит: «Использование необъявленного идентификатора« Utils » – Khuong

+1

Да, это действительно работает. Это еще одна проблема. Вам нужно наследовать 'Utils' от' NSObject'. – HAS

+0

Да. Теперь это работает. Спасибо;) – Khuong

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