GLKView is empty when drawing

I am trying to put images in a UITableViewCell using GLKView to draw an image.

I have a cell prototype in a storyboard in which I have GLKView. It does not have the Enable setNeedsDisplay checkbox selected.

The prototype cell has a custom class called PhotoTableViewCell, which

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") } } 

This is used in the 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 } 

When I go to TableView, I get the following log statements

 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>>) 

My questions is why is it empty? I'm sure there is an image that glkView is in the right place (I checked it with the preview tool in Xcode)

Why is drawing (rect :) called instead of glkView (view: GLKView, drawIn rect: CGRect)?

I use Xcode 8, swift 3 on iPhone 5, running iOS 9.3, any help that is greatly appreciated

+6
source share
1 answer

I'm not sure if Xcode handles this automatically, or if the context is activated by default, but in my only OpenGL project that I have done so far, I had to use:

 [EAGLContext setCurrentContext:ciContext]; 

when I need my context to be active.

+1
source

All Articles