Ios 在循环执行期间更改UIImageView UIImage
我有一个函数,它使用视频作为avurlast,并按时间间隔剪切视频。我还有一个名为previewImageView的UIImageview IBOutlet,我希望在执行函数时更改图像。此函数在viewDidLoad中调用。previewImageView似乎仅在函数完成执行后设置。下面是我的代码Ios 在循环执行期间更改UIImageView UIImage,ios,swift,Ios,Swift,我有一个函数,它使用视频作为avurlast,并按时间间隔剪切视频。我还有一个名为previewImageView的UIImageview IBOutlet,我希望在执行函数时更改图像。此函数在viewDidLoad中调用。previewImageView似乎仅在函数完成执行后设置。下面是我的代码 func getImagesAtInterval(url: NSURL){ let asset : AVURLAsset = AVURLAsset(URL: url, options: ni
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
}
}
func getImagesInterval(url:NSURL){
let-asset:avurlaste=avurlaste(URL:URL,选项:nil)
let duration:CMTime=asset.duration
让totalTime=Int(CMTimeGetSeconds(持续时间)*1000)
让assetGenerator:AVAssetImageGenerator=AVAssetImageGenerator(资产:资产)
图像集=[UIImage]()
var值=0
对于变量i:Int=0;i
我已尝试按照参考资料中的建议执行操作,您需要使图像无效,以便它立即刷新。 只需调用UIView的
setNeedsDisplay()
函数
dispatch_async(dispatch_get_main_queue())
{
self.previewImageView.image = image
self.previewImageView.setNeedsDisplay()
}
改用
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
{
}
我通过在viewDidLoad的后台线程中调用getImageAtInterval方法并在UIThread:)中调用“previewImageView.image=image”解决了这个问题。感谢您的回复,虽然它似乎不起作用,但也许我没有给足够的时间来绘制图像?我希望在生成图像时,预览图像视图的图像也将更改,直到循环结束。对不起,我更新了我的答案。它应该是函数setNeedsDisplay。干杯。仍然不起作用,请查看更新的问题与链接,并告诉我你的想法,干杯延迟屏幕更新一次完成所有操作控制传递回运行循环。改用
CADisplayLink
,它将调用您在屏幕更新时提供的方法。感谢您的回复,我将代码转换为swift,但它似乎不起作用。我在进入GetImageSatiInterval函数时调用了startUpdating,在循环之后调用了StopUpdate(外部)。在doframe中,我将previewImageView图像设置为imageSet.last,因为imageSet是uiimages数组。这不起作用。所有这些都发生在同一个线程上,因此很明显,如果您继续占用线程上的CPU,那么其他事情就不会发生。您需要检索图像并在中显示它们doFrame@DrPatience,如果答案对你有帮助,请随意投票和/或接受。