Ich versuche, Bilder in eine UITableViewCell mithilfe einer GLKView zu platzieren, um das Bild zu zeichnen.GLKView ist leer, wenn es gezeichnet wird
Ich habe eine Prototyp-Zelle in einem Storyboard, in dem ich eine GLKView habe. Es wurde nicht Enable setNeedsDisplay aktiviert.
Das hat Prototyp Zelle eine benutzerdefinierte Klasse PhotoTableViewCell genannt, die
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")
}
}
Dies ist in einem UITableViewController verwendet wird
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
}
Als ich in die Tableview navigieren ich die folgenden Protokollanweisungen erhalten
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>>)
Meine Fragen sind, warum es die Ansicht leer? Ich bin mir sicher, dass es ein Bild gibt, dass der glkView an der richtigen Stelle ist (ich habe es mit dem Vorschau-Tool in Xcode inspiziert)
Warum wird draw (rect :) aufgerufen und nicht glkView (view: GLKView, drawIn rect: CGRect)?
ich verwende Xcode 8, schnelle 3 auf einem iPhone 5 mit iOS 9.3, jede Hilfe sehr geschätzt
Hey Mark. Hast du es gelöst? –
Nein, funktioniert immer noch nicht –