我有一种情况,我不明白。
我喜欢在后台任务中创建CATextLayers并在我的视图中显示它们,因为这需要一些时间。
这是完美的工作没有背景任务。我可以在“世界地图视图”中立即看到文本

@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也是如此。

最佳答案

似乎setNeedDisplay不会导致子层重新绘制,我们需要在所有需要的层上调用它,在本例中,它是新添加的层

func addlayerandrefresh_background(){
    let calayer = CALayer()
    calayer.frame = self.worldmapview.bounds

    dispatch_async(backgroundQueue, {
        for var i = 0; i < 100 ; i+=10 {
            let newtextlayer:CATextLayer=self.create_text_layer(0, y1: CGFloat(i) ,width:200,heigth:200,text:"My Text ....",fontsize:5)
            calayer.addSublayer(newtextlayer)
        }
        dispatch_async(dispatch_get_main_queue(),{
            self.worldmapview.layer.addSublayer(calayer)
            for l in calayer.sublayers! {
                l.setNeedsDisplay()
            }
        })

    })
}

10-07 19:56
查看更多