【发布时间】:2015-11-11 11:59:06
【问题描述】:
我有一种情况,我不明白。 我喜欢在后台任务中创建 CATextLayers 并在我的视图中显示它们,因为这需要一些时间。
这在没有后台任务的情况下完美运行。我可以立即在我的视图“worldmapview”中看到文本
@IBOutlet var worldmapview: Worldmapview! // This view is just an empty view.
override func viewDidLoad(){
view.addSubview(worldmapview);
}
func addlayerandrefresh_direct(){
var calayer=CALayer();
var newtextlayer:CATextLayer=create_text_layer(0,y1: 0,width:1000,heigth:1000,text:"My Text ....",fontsize:5);
self.worldmapview.layer.addSublayer(newtextlayer)
//calayer.addSublayer(newtextlayer);
calayer.addSublayer(newtextlayer)
self.worldmapview.layer.addSublayer(calayer);
self.worldmapview.setNeedsDisplay();
}
在后台任务中执行此操作时,文本不会出现在我的视图中。有时,并非总是如此,它会在几秒钟后出现(例如 10 秒钟)。
func addlayerandrefresh_background(){
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
var calayer=CALayer();
var newtextlayer:CATextLayer=create_text_layer(0,y1: 0,width:1000,heigth:1000,text:"My Text ....",fontsize:5);
dispatch_async(dispatch_get_main_queue(),{
self.worldmapview.layer.addSublayer(newtextlayer)
//calayer.addSublayer(newtextlayer);
calayer.addSublayer(newtextlayer)
self.worldmapview.layer.addSublayer(calayer);
self.worldmapview.setNeedsDisplay();
})
})
}
func create_text_layer(x1:CGFloat,y1:CGFloat,width:CGFloat,heigth:CGFloat,text:String,fontsize:CGFloat) -> CATextLayer {
let textLayer = CATextLayer()
textLayer.frame = CGRectMake(x1, y1, width, heigth);
textLayer.string = text
let fontName: CFStringRef = "ArialMT"
textLayer.font = CTFontCreateWithName(fontName, fontsize, nil)
textLayer.fontSize=fontsize;
textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
textLayer.wrapped = true
textLayer.alignmentMode = kCAAlignmentLeft
textLayer.contentsScale = UIScreen.mainScreen().scale
return textLayer;
}
有人看到了吗,怎么了? 非常令人困惑的是:在后台使用 CAShapeLayer 也是如此。
【问题讨论】:
-
请查看我的回答。我认为这个问题不需要赏金。这很简单:)
-
嗨,法瓦德。这对你来说可能很简单:-),但我仍然不知道该怎么做。你能帮我更多吗?我的代码可以粘贴来重现问题。我很高兴看到让这个工作的更正。因为从理论和阅读文档来看,我仍然不明白。
-
你说“这在没有后台任务的情况下完美运行”,那你为什么要在后台做呢?我已经在主线程上执行了任务(使用您的代码),并且我在 worldMapView 上添加了 100 个子视图,并且没有延迟。请检查是否有其他原因导致延迟。
标签: ios swift calayer cashapelayer