好吧,我正在尝试做的是更改某个图像的像素数据.我想使用每次循环作为进度条时向右移动的UIView.然而,正在发生的事情是屏幕在计算过程中冻结,直到完成后才会发生任何事情.状态栏时钟也不会更新.有没有办法将这些计算以某种方式移动到背景并仍然使用屏幕空间?
func lock() { let lockView = UIImageView(image: self.photoBackgroundView.image!) var progressBar = UIView(frame: CGRectMake(-self.view.width,self.view.width,20) let increment = progressBar.width/self.photoBackgroundView.width var password = self.textField.text! if password == "" { password = " " } var currentIndex = 0 let imageRect = CGRectMake(0,self.photoBackgroundView.image!.size.width,self.photoBackgroundView.image!.size.height) UIGraphicsBeginImageContext(self.photoBackgroundView.image!.size) let context = UIGraphicsGetCurrentContext() CGContextSaveGState(context) CGContextDrawImage(context,imageRect,self.photoBackgroundView.image!.CGImage) for x in 0...Int(self.photoBackgroundView.image!.size.width) { print(x) progressBar.frame.origin.x += (CGFloat(x) * increment) self.view.addSubView(progressBar) for y in 0...Int(self.photoBackgroundView.image!.size.height) { let pointColor = lockView.layer.colorOfPoint(CGPoint(x: x,y: y)) if currentIndex == Array(password.characters).count { currentIndex = 0 } let red = encrypt(pointColor.components.red,passwordChar: Array(password.characters)[currentIndex],currentIndex: currentIndex,x: x,y: y) currentIndex++ if currentIndex == Array(password.characters).count { currentIndex = 0 } let green = encrypt(pointColor.components.green,y: y) currentIndex++ if currentIndex == Array(password.characters).count { currentIndex = 0 } let blue = encrypt(pointColor.components.blue,y: y) currentIndex++ CGContextSetRGBFillColor(context,red,green,blue,pointColor.components.alpha) CGContextFillRect(context,CGRectMake(CGFloat(x),CGFloat(y),1,1)) } } CGContextRestoreGState(context) let newImage = UIGraphicsGetimageFromCurrentimageContext() self.photoBackgroundView.image = newImage self.slideView.addSubview(photoBackgroundView) self.view.addSubview(self.slideView) }
解决方法
您可以在
background thread中进行这些计算.
斯威夫特2:
let priority = disPATCH_QUEUE_PRIORITY_DEFAULT dispatch_async(dispatch_get_global_queue(priority,0)) { // Put the calculations here dispatch_async(dispatch_get_main_queue()) { // any updates of the UI need to be here to do them in the main thread after your background task. For example adding subviews } }
斯威夫特3: