в моем ViewController у меня есть:UIImage не отображается при добавлении к CALayer в backgroundtask
@IBOutlet var worldmapview: Worldmapview!
var eventLayer:CALayer=CALayer();
и некоторые функции:
func create_picture_layer(pathtopic:String) -> CALayer {
let bm=getImage(pathtopic,fBitmapsizeSelected: 100)!;
var calayer_for_picture=CALayer();
calayer_for_picture.frame=CGRectMake(100, 100, 100, 100);
calayer_for_picture.contents = bm.CGImage;
return calayer_for_picture;
}
func createCircleShape(x:CGFloat,y:CGFloat, size:CGFloat) -> CAShapeLayer {
var test2:UIBezierPath=UIBezierPath(ovalInRect: CGRectMake(x - size/2, y - size/2, size, size));
var shapelayer:CAShapeLayer=CAShapeLayer();
shapelayer.backgroundColor=UIColor.clearColor().CGColor;
//shapelayer.frame=CGRectMake(0, 0, 300, 300);
shapelayer.fillColor=UIColor.darkGrayColor().CGColor;
shapelayer.path=test2.CGPath;
shapelayer.opaque=true
return shapelayer;
}
func getImage(simagename: String, fBitmapsizeSelected:CGFloat) -> UIImage?{
var sPathToImage:String=AppProperties.sharedInstance.sPicturePath + simagename;
let checkValidation = NSFileManager.defaultManager()
if (!checkValidation.fileExistsAtPath(sPathToImage) || simagename.equals("")){
// Path to unknown image
let sunknownimagename:String = "na/na.jpa";
sPathToImage=AppProperties.sharedInstance.sPicturePath + sunknownimagename;
}
let bm:UIImage=UIImage(contentsOfFile: sPathToImage)!;
var bMapScaled:UIImage;
if(!bm.isEqual(nil)){
let newSize:CGSize=CGSizeMake(fBitmapsizeSelected, fBitmapsizeSelected);
bMapScaled = bm.imageByScalingToSize(newSize,contentMode: UIViewContentMode.ScaleAspectFill)!;
return bMapScaled;
}else{
return nil;
}
}
В моей viewDidAppear(animated: Bool) method
я пытаюсь показать изображение в worldmapview
следующий код отлично работает без каких-либо фоновых задач. Изображение отображается немедленно.
// works
let thepicturelayer=create_picture_layer("mypicpath")
eventLayer.addSublayer(thepicturelayer);
worldmapview.layer.addSublayer(eventLayer);
eventLayer.setNeedsDisplay();
в фоновом задании и освежении в главной задаче, это не работает для меня. Изображение не отображается. Через некоторое время появляется, но не всегда.
// doesn't work
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
// geht auch mit Eventlayer
let thepicturelayer=self.create_picture_layer() // This Shape doesn't appear.
let circleshapelayer=self.createCircleShape(200, y: 200, size: 20) // This shape appears immediatelly.
self.eventLayer.addSublayer(thepicturelayer);
self.eventLayer.addSublayer(circleshapelayer);
dispatch_async(dispatch_get_main_queue(),{
//assert(self.eventLayer.sublayers?.count > 0,"no layers in eventLayer !") // just added
self.worldmapview.layer.addSublayer(self.eventLayer);
//assert(self.worldmapview.layer.sublayers!.count > 0,"no layers in worldmapview!") // just added
let sublayers=self.eventLayer.sublayers;
if sublayers != nil {
for l in self.eventLayer.sublayers! {
l.setNeedsDisplay()
}
}
//self.updateWorldMapGUI();
self.worldmapview.layer.addSublayer(self.eventLayer);
//thepicturelayer.setNeedsDisplay();
//circleshapelayer.setNeedsDisplay();
self.eventLayer.setNeedsDisplay();
})
})
Update
Я обновил код с новым CAShapelayer добавил тот же самый путь, который сразу же отображающее. Я не понимаю разницы. Изображение не отображается при создании в фоновом задании.
UPDATE2
я понял, что-то запутанную мне дополнительно: После кода без фоновой задачи работы, как уже было описано:
let thepicturelayer=create_picture_layer()
eventLayer.addSublayer(thepicturelayer);
worldmapview.layer.addSublayer(eventLayer);
eventLayer.setNeedsDisplay();
//thepicturelayer.setNeedsDisplay(); // When adding this, the picture is not shown.
Но активации последней строки, картинка не отображается. Наверное, это как-то связано с этим? Похоже, что содержание жалобы пропало?
Можете ли вы подтвердить, что 'self.create_picture_layer ("mypicpath")' является синхронным, и не возвращается сразу? – SwiftArchitect
Вы правы. Я обновил код. Я написал «его пустой», и он столкнулся с этой ситуацией. Есть ли у вас какие-либо намеки, как это решить? Я хотел бы подготовить слой в фоновом режиме и обновить последующие слова, когда будет добавлен слой. Как это сделать ? –
Вы не должны изменять интерфейс в фоновом потоке. – kelin