2014-08-11 6 views
0

Вот класс, который размывает представление. Я знаю, что у iOS8 есть новый UIVisualEffectView, но я ориентируюсь на iOS7.
У меня проблема с массивом, не заполняющим CGImage! объекты. Код работает до конца func decreasinglyBlurredImages(), что, когда я получаю эту ошибку:CGImage! массив не заполняется

0x410fc4: cmp r6, #0x0 
0x410fc8: beq 0x411004     ; partial apply forwarder for  Swift._ContiguousArrayBuffer.(_asCocoaArray <A>(Swift._ContiguousArrayBuffer<A>) ->() -> Swift._CocoaArray).(closure #1) with unmangled suffix "340" + 164 
0x410fcc: ldr r0, [r5] 
0x410fd0: mov r1, r4 
0x410fd4: ldr r2, [r0, #12] 
0x410fd8: mov r0, sp 
0x410fdc: blx r2 
0x410fe0: ldr r0, [r5] 
0x410fe4: mov r1, r4 
0x410fe8: ldr r2, [r0, #16] 
0x410fec: mov r0, r8 
0x410ff0: blx r2 
0x410ff4: mov r0, r6 
0x410ff8: sub sp, r7, #0x10 
0x410ffc: ldr r8, [sp], #4 
0x411000: pop {r4, r5, r6, r7, pc} 
0x411004: trap       Thread:3 EXE_BREAKPOINT .... 

На дне почти весь код для этого класса. Я просто пытался предварительно заполнить массив ради скорости и столкнулся с этой проблемой. Интересно отметить, если я изменю optBlurredImagesForAnimation к UIImage и сделать это:

func decreasinglyBlurredImages()->[UIImage] 
{ 
    var images:[UIImage] = [] 

    for var i = numberOfImagesForAnimation; i > -1; i-- 
    { 
     var blurredImageForAnimation:UIImage = UIImage(CGImage: blurImage(i)) 

     images.append(blurredImageForAnimation) 
    } 
    return images 
} 

все работает! Тем не менее, я в конце концов хотел бы использовать этот массив CGImage s в CAKeyFrameAnimation, поэтому мне нужно CGImage s. Спасибо за внешний вид, и вот сломанный класс!

import UIKit 
import Foundation 
import QuartzCore 

class AEBlurryImage: UIView { 

    let imageToBlur:UIImage 
    let blurFactor:NSNumber 
    let numberOfImagesForAnimation = 10 
    let buttonTitle:String? 
    var optBlurredImagesForAnimation:[CGImage!]? 


    init(frame: CGRect, image:UIImage, blurFactor:NSNumber) 
    { 
     imageToBlur = image 

     if blurFactor == 0 
     { 
      self.blurFactor = self.numberOfImagesForAnimation 
     }else 
     { 
     self.blurFactor = blurFactor 
     } 

     super.init(frame: frame) 
    } 


    func displayBlurredImage() 
    { 
     var blurredImage:CGImage! 

     //get the blurred image and add it to the layer 

     blurredImage = self.blurImage(nil) 
     self.layer.contents = blurredImage 

     if let blurredImagesForAnimation = optBlurredImagesForAnimation 
     { 
      return 

     }else{ 

      let imageQueue:dispatch_queue_t = dispatch_queue_create("iQ", DISPATCH_QUEUE_SERIAL) 

      dispatch_async(imageQueue){ 
       self.optBlurredImagesForAnimation = self.decreasinglyBlurredImages() 
      } 
     } 
    } 


    func blurImage(optionalFactor:NSNumber?)->CGImage! 
    { 
      var context:CIContext = CIContext(options:nil) 
      var image:CIImage  = CIImage(image:imageToBlur) 
      var filterName:String? = "CIGaussianBlur" 
      var filter:CIFilter  = CIFilter(name:filterName) 

      filter.setValue(image, forKey: kCIInputImageKey) 

      //if optionalFactor is nil, just use the blurFactor 
      if var factor = optionalFactor 
      { 
       filter.setValue(factor, forKey:kCIInputRadiusKey) 
      }else 
      { 
       filter.setValue(blurFactor, forKey: kCIInputRadiusKey) 
      } 

      var result:CIImage  = filter.outputImage 
      var rect:CGRect   = result.extent() 
      var cgImage:CGImage!  = context.createCGImage(result, fromRect: rect) 

      var blurredImage:CGImage! = cgImage 

      return blurredImage 
    } 


    func decreasinglyBlurredImages()->[CGImage!] 
    { 
     var images:[CGImage!] = [] 

     for var i = numberOfImagesForAnimation; i > -1; i-- 
     { 
      var blurredImageForAnimation:CGImage! = self.blurImage(i) 

      images.append(blurredImageForAnimation) 
     } 
     return images 
    } 
} 
+1

Я запустил ваш код, и он отлично работает. Мне пришлось добавить 'обязательный init (coder aDecoder: NSCoder!)' И изменить 'if blurFactor == 0' на' if blurFactor.integerValue == 0', но в остальном все хорошо работает на простом одноцветном изображении. – Rikkles

+0

Интересно. Хорошо, спасибо, что нашли время. Что Xcode Build вы используете? – headache

+0

6 beta 5. Я запустил его, создав фиктивный проект с контроллером вида, а в 'viewDidLoad' я вызываю код, передавая в кадре основного представления одноцветное изображение, и номер 4. – Rikkles

ответ

0

Я думаю, что я понял свою проблему. Проблема заключалась в использовании устройства, которое я использовал для разработки. Устройство представляет собой iPhone 5 с iOS7, а не iOS8. Этот код отлично работает в симуляторе, и это, и то, что сказал Риккле, - это то, что окончательно взломало его для меня. Еще раз спасибо!

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