2016-09-18 73 views
6

我想将图像放入使用GLKView绘制图像的UITableViewCell中。GLKView绘制时为空

我有一个故事板中的原型单元格,其中有一个GLKView。它没有选中Enable setNeedsDisplay。

原型电池有所谓的PhotoTableViewCell一个自定义的类,这是

import UIKit 
import GLKit 

class PhotoTableViewCell: UITableViewCell { 

    var eaglContext:EAGLContext! 
    var ciContext:CIContext! 
    var myImage:CIImage! 

    @IBOutlet weak var photoGlView: GLKView! 
    @IBOutlet weak var timeLabel: UILabel! 
    @IBOutlet weak var cameraLabel: UILabel! 
    @IBOutlet weak var notesLabel: UILabel! 

    override func layoutSubviews() { 
    self.photoGlView.delegate = self 
} 

} 

extension PhotoTableViewCell: GLKViewDelegate { 
    override func draw(_ rect: CGRect) { 
     let drawableRectSize = CGSize(width: 200, height: 200)// width: photoGlView.drawableWidth, height: photoGlView.drawableHeight) 

     let drawableRect = CGRect(origin: CGPoint.zero, size: drawableRectSize) 
     print("rect ->\(drawableRect)") 
     print("rect size -> \(drawableRectSize)") 
     ciContext.draw(myImage, in: drawableRect, from: myImage.extent) 
     print("drawing rect my image =\(photoGlView)") 
    } 

    func glkView(_ view: GLKView, drawIn rect: CGRect) { 
     let drawableRectSize = CGSize(width: view.drawableWidth, height: view.drawableHeight) 
     let drawableRect = CGRect(origin: CGPoint.zero, size: drawableRectSize) 
     ciContext.draw(myImage, in: drawableRect, from: myImage.extent) 
     print("drawing") 
    } 
} 

这一个UITableViewController

class PhotosTableViewController: UITableViewController { 

    var cameraId:Int = 1 
    var photos:[Photo] = [] 
    var eaglContext:EAGLContext! 
    var ciContext:CIContext! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.eaglContext = EAGLContext(api: .openGLES2) 
    self.ciContext = CIContext(eaglContext: eaglContext!) 

} 

.... 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "photoCell") as! PhotoTableViewCell 
     let photo = photos[indexPath.row] 
     if let image = photo.getLightImage() { 
      cell.ciContext  = ciContext 
      cell.eaglContext = eaglContext 
      cell.myImage  = image 
      cell.photoGlView.display() 
     } 
     cell.cameraLabel.text = AppService.shared.getCameraName(id: photo.cameraId) 
     cell.timeLabel.text = "Taken: \(photo.uploaded?.niceTime() ?? "")" 
     return cell 
} 

用来当我浏览到的TableView我得到以下日志语句

rect ->(0.0, 0.0, 200.0, 200.0) 
rect size -> (200.0, 200.0) 
drawing rect my image =Optional(<GLKView: 0x1560bed0; frame = (0 0; 191 253); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; tintColor = UIDeviceRGBColorSpace 0 0 0 1; layer = <CAEAGLLayer: 0x1560e530>>) 
rect ->(0.0, 0.0, 200.0, 200.0) 
rect size -> (200.0, 200.0) 
drawing rect my image =Optional(<GLKView: 0x156044f0; frame = (0 0; 191 253); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; tintColor = UIDeviceRGBColorSpace 0 0 0 1; layer = <CAEAGLLayer: 0x15604610>>) 

我的问题是为什么它的视图空白?我相信有一个图像,glkView是在正确的地方(我已经检查了Xcode中的预览工具)

为什么绘制(rect :)被调用,而不是glkView(视图:GLKView, drawRect:CGRect)?

我使用5运行iOS 9.3的iPhone的Xcode 8,快捷3,任何帮助非常感谢

+0

嘿马克。你解决了吗? –

+0

不,仍然无法正常工作 –

回答

1

我不知道,如果Xcode中会自动处理莫名其妙或上下文是否默认激活,但在我只有OpenGL的项目我做了,到目前为止,我不得不使用:

[EAGLContext setCurrentContext:ciContext]; 

每当我需要我的情况下被激活。