2015-12-01 2 views
0

У меня есть функция, которая использует видео как AVURLAsset и разрезает видео с временными интервалами. У меня также есть UIImageview IBOutlet, называемый previewImageView, который я хотел бы, чтобы изображения менялись по мере выполнения функции. Эта функция вызывается в viewDidLoad. Кажется, что PreviewImageView настроен после того, как функция завершила выполнение. Мой код нижеИзменение UIImageView UIImage во время выполнения цикла

func getImagesAtInterval(url: NSURL){ 

    let asset : AVURLAsset = AVURLAsset(URL: url, options: nil) 
    let duration : CMTime = asset.duration 
    let totalTime = Int(CMTimeGetSeconds(duration) * 1000) 
    let assetGenerator : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) 

    imageSet = [UIImage]() 
    var value = 0 

    for var i : Int = 0; i < totalTime; i+=200 { 

     let time : CMTime = CMTimeMake(Int64(value), 1000) 
     var imageRef : CGImageRef! 
     do { 
      imageRef = try assetGenerator.copyCGImageAtTime(time, actualTime: nil) 
     } catch let error as NSError { 
      print("Image generation failed with error \(error)") 
     } 
     if let image : UIImage? = UIImage(CGImage: imageRef){ 
      dispatch_async(dispatch_get_main_queue()) { 

//I would like to see the images in the previewImageView 
//change as the loop operates. 
       self.previewImageView.image = image 
      } 
      imageSet.append(image!) 
     }   
     value += 200 
    } 
} 

Я пытался сделать, как предложено в ресурс enter link description here

+0

задержки UIKit экранировать обновления, чтобы сделать их все сразу управление переходит к циклу запуска. Вместо этого используйте 'CADisplayLink', который вызовет метод, который вы дадите ему на экранных обновлениях. – jcaron

ответ

0

Вы должны аннулировать изображение для того, чтобы обновить сразу. Просто позвоните setNeedsDisplay() Функция UIView.

dispatch_async(dispatch_get_main_queue()) 
{ 
    self.previewImageView.image = image 
    self.previewImageView.setNeedsDisplay() 
} 
+0

Спасибо за ответ, хотя он, похоже, не работает, возможно, я не даю достаточно времени для рисования изображений? Я хочу, чтобы сгенерированы изображения, а из PreviewImageView также будет изменяться до тех пор, пока цикл не завершится. – DrPatience

+0

Извините, я обновил свой ответ. Вместо этого должна быть функция setNeedsDisplay. Приветствия. –

+0

все еще не работает, пожалуйста, ознакомьтесь с обновленным вопросом со ссылкой и скажите мне, что вы думаете, приветствия – DrPatience

0

Использование CADisplayLink вместо, который будет пытаться синхронизировать с обновлением экрана.

Вот код Objective-C, я оставлю его как упражнение для чтения, чтобы преобразовать его в Swift.

// call this method when you want to start updates 
- (void)startUpdates 
{ 
    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doFrame)]; 
    _displayLink.frameInterval = 1; 
    [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; 
} 

// I'll let you guess 
- (void)stopUpdates 
{ 
    [_displayLink invalidate]; 
    _displayLink = nil; 
} 

// In this method, do any needed updates. 
// Note that it will not necessarily be called every single frame, 
// so check actual time to decide what to display 
- (void)doFrame 
{ 
} 
+0

Спасибо за ваш ответ, я быстро преобразовал код, но он, похоже, не работает. Я вызвал startUpdating при вводе функции getImagesAtInterval и stopUpdating после цикла (снаружи). В doframe я устанавливал изображение previewImageView в imageSet.last, поскольку imageSet представляет собой массив uiimages. – DrPatience

+0

Это не сработает. Все это происходит в одном потоке, так что, очевидно, если вы продолжаете зацикливать процессор на потоке, больше ничего не происходит. Вам нужно получить изображения и отобразить их в doFrame – jcaron

+0

@DrPatience, если ответ вам помог, не стесняйтесь голосовать и/или принимать его. – jcaron

0

Я решил проблему, вызвав мой getImageAtInterval метод в фоновом потоке в viewDidLoad и вызова «previewImageView.image = образ» в UIThread :)

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