2017-03-25 2 views
1

Ich benutze Scroll View, um ein Bild zu scrollen. Ich verwende einen Schieberegler 1 - 26, um CGPoint von einem Array für x-Achsenpunkte abzurufen. Alles verhält sich wie erwartet und das Bild ist im Übergang glatt.Swift Scroll View mit Slider und MIDI

Ich habe auch eine Taste eingerichtet, die bei einem Tastendruck von 1 - 26 zählt und Schleifen, um CGPoint von einem Array für x-Achsenpunkte abzurufen. Alles verhält sich wie erwartet und das Bild ist im Übergang glatt.

Ich habe auch MIDI eingerichtet, das die Daten 1 - 26 basierend auf der Geschwindigkeit sendet, die an den Schieberegler gesendet wird, und der Schieberegler bewegt sich wie erwartet. Ich verwende auch MIDI, um CGPoint von einem Array für x-Achsenpunkte abzurufen. Leider obwohl es will zeigt folgende Bilder scrollen, was passiert, nur 4 Bilder zu sehen bekommen, wie es rollt und man kann durch den beweglichen Schieber sagen, wenn sie

Under Midi Control

Ich bin sehr zuversichtlich erscheinen, dass die Midi funktioniert richtig, da ich es immer benutze, um von Arrays zu lesen. Ich habe auch versucht, den Knopf von Midi eine Art virtuelle Presse auszulösen. Dies funktioniert wie erwartet, zeigt aber dasselbe wie das Triggern direkt von Midi. Es scheint, als sei alles in Ordnung, solange die Schriftrolle von einer IB-Komponente stammt.

unter MIDI-Kontrolle der Bildlaufleiste stottert auch, aber wenn ich

clipView.wantsLayer = true 

Das Bild scrollen nicht unter midi gesetzt, aber die Bildlaufleiste bewegt sich wie erwartet. Obwohl der Schieberegler und die Schaltfläche wie erwartet funktionieren.

Ich habe auch alle Dinge ausprobiert, die im playMidi kommentiert wurden. Außerdem versuchen Sie alle verschiedenen Parameter in der IB-Sektion.

Ich bin an einem Punkt, wo ich wirklich mit etwas Hilfe bitte tun könnte. Hier ist mein Code, der hoffentlich auch erklärt, was ich versucht habe. Ich habe auch verschiedene versucht

needsDisplay = true 

auf allen Ansichten

Xcode 8 swift3 OSX nicht iOS

Vielen Dank für Ihre Zeit

import Cocoa 
import CoreMIDI 

class MainWindowController: NSWindowController { 
    static var subWindowController: MainWindowController! 

    var pointArray:[Double] = [99.00,0.00,40.00,80.00,120.00,160.00,200.00,240.00,280.00,320.00,360.00,400.00,440.00,480.00,520.00,560.00,600.00,640.00,680.00,720.00,760.00,800.00,840.00,880.00,920.00,960.00,1000.00] 

    @IBOutlet weak var scrollView: NSScrollView! 
    @IBOutlet weak var clipView: NSClipView! 
    @IBOutlet weak var ImageView: NSImageView! 
    @IBOutlet var scrollerBar: NSScroller! 
    @IBOutlet weak var sliderControl: NSSlider! 

    var myPointer = CGPoint.init(x: 0.0, y: 0.0) 
    var fromArray:Double = 0.0 
    var buttonCount = 0 

    override func windowDidLoad() { 
     super.windowDidLoad() 
     MainWindowController.subWindowController = self // USED for midi 

     //Initialize midi client 
     var midiClient: MIDIClientRef = 0; 
     var inPort:MIDIPortRef = 0; 
     var src:MIDIEndpointRef = MIDIGetSource(0); 
     MIDIClientCreate("MidiTestClient" as CFString, nil, nil, &midiClient); 
     MIDIInputPortCreate(midiClient, "MidiTest_InPort" as CFString, MyMIDIReadProc, nil, &inPort); 
     MIDIPortConnectSource(inPort, src, &src); 

     //Set paramameters 
     scrollerBar.doubleValue = 0.9 

     let scrollViewSize = NSSize(width: 287, height: 119) 
     scrollView.setFrameSize(scrollViewSize) 
     let scrollViewColor = CGColor(red: 0.0, green: 0.0, blue: 0.9, alpha: 0.5) 
     scrollView.wantsLayer = false 
     scrollView.layer?.backgroundColor = scrollViewColor 
     scrollView.drawsBackground = false 

     let clipViewSize = NSSize(width: 1274, height: 88) 
     clipView.setFrameSize(clipViewSize) 
     let clipViewColor = CGColor(red: 0.0, green: 0.0, blue: 0.9, alpha: 0.5) 
     clipView.wantsLayer = false //If true image freezes but scoller moves with midi 
     clipView.layer?.backgroundColor = clipViewColor 
     clipView.drawsBackground = false 

     let ImageViewSize = NSSize(width: 1274, height: 87) 
     ImageView.setFrameSize(ImageViewSize) 
     /* let ImageViewColor = CGColor(red: 0.0, green: 0.9, blue: 0.0, alpha: 0.5) 
     ImageView.wantsLayer = false 
     ImageView.layer?.backgroundColor = ImageViewColor*/ 

    }//EO Overide 


    func playMidi(count:Int){ 

     //print("MIDi",count) 
     let fromCountIndex = count // Gets 1 to 26 from midi 

     //Gets double from Array 1 to 26 on Index == 0.0 to 960.0 
     fromArray = pointArray[fromCountIndex] 

     /*SCROLL BAR THINGS I HAVE TRIED*/ 
     let scrollerValue = fromArray/960 
     scrollerBar.doubleValue = scrollerValue 
     /* scrollerBar.display() 
     scrollerBar.isContinuous = true */ 

     /*CLIP VIEW SCROLL FROM ARRAY TRIGGERED BY MIDI */ 
     myPointer = CGPoint(x:fromArray,y:0.0) 
     clipView.scroll(myPointer) 
     /*scrollView.scroll(clipView, to: myPointer)*/ 

     /*THIS FAKES A BUTTON FIRE BUT STILL SAME PROBLEM*/ 
     /* let mySelector = #selector(myButton(_:)) 
     myButton(mySelector as AnyObject)*/ 

     /* DISPLAY VIEWS I HAVE TRIED*/ 
     // scrollView.scrollsDynamically = true 

     /*MOVES THE SLIDER USING MIDI*/ 
     sliderControl.integerValue = count 

    }//eo playMidi 


    @IBAction func myButton(_ sender: AnyObject) { 
     fromArray = pointArray[buttonCount] 
     myPointer = CGPoint(x:fromArray,y:0.0) 
     clipView.scroll(myPointer) 
     buttonCount = buttonCount + 1 
     if (buttonCount > 26){buttonCount = 0} 
     print("buttonCount",buttonCount) 
    } 

    @IBAction func mySlider(_ sender: AnyObject) { 
     let fromSlider = sender.integerValue * 1 
     //Gets double from Array 1 to 26 on Index == 0.0 to 960.0 on array set to 40 when using slider moves scroll bar 
     fromArray = pointArray[fromSlider] 
     myPointer = CGPoint(x:fromArray,y:0.0) 
     clipView.scroll(myPointer) 
     print("fromSlider",fromSlider) 
    } 


}//EnD oF thE wORld 

Antwort

0

Weitere meinem Code wie oben Ich habe beantwortete die Frage nicht, sondern fand ein "herumkommen". Ich bin wirklich nicht stolz darauf, aber es scheint eine Frage zu stellen, die vielleicht jemand beantworten könnte. Da der obige Code mit der Scroll-Ansicht nicht funktionierte, habe ich stattdessen versucht, CAScrollLayer zu verwenden.

Die grundlegende Einrichtung ist wie folgt. Ich habe eine Ansicht innerhalb dieser Ansicht Ich habe eine Scroll-Ebene erstellt und darin eine Ebene. Wie oben, wenn ich einen Timer verwende, um die Scroll-Ansicht auszulösen, funktioniert alles perfekt. Und wieder wie oben, wenn ich Midi benutze, dann passiert die Scroll nicht. Also die Arbeit ist um. Das Midi 1-26 liest den Punktwert, aber anstatt es an die Scroll zu senden, sendet es es an eine Übergangsvariable.

Ich habe eine "Run Button" auf der Schnittstelle das würde normalerweise die scrollLayerScroll arbeiten. Es tut dies immer noch, aber mit unglaublicher Geschwindigkeit. Aber anstatt eine eigene Transitionsvariable zu generieren, verwendet sie die erzeugte Midi-Funktion. Es gibt einen Code, der sicherstellt, dass nur eine eindeutige Nummer an den Punkt gesendet wird.

Dies funktioniert, aber verdient wirklich einen Preis für das schlimmste Bit der Codierung überhaupt.

Ich denke, es gibt etwas in der Art, wie der Timer alles aktualisiert, was ich extrahieren muss. Ich hoffe, dass jemand noch Mitleid nehmen kann und helfen

Dank wieder

hier wird die überarbeitete Code Xcode 8 swift3 OSX nicht iOS

import Cocoa 
import CoreMIDI 

class MainWindowController: NSWindowController { 
    static var subWindowController: MainWindowController! 

    var myLayer = CALayer() 
    var myPointer = CGPoint.init(x: 0.0, y: 0.0) 
    var fromArray:Double = 0.0 
    var buttonCount = 0 
    var pointArray:[Double] = [99.00,0.00,40.00,80.00,120.00,160.00,200.00,240.00,280.00,320.00,360.00,400.00,440.00,480.00,520.00,560.00,600.00,640.00,680.00,720.00,760.00,800.00,840.00,880.00,920.00,960.00,1000.00] 

    @IBOutlet weak var myCustomView: NSView! 

    var translation: CGFloat = 0.0 
    var newTranslation:CGFloat = 0.0 
    var comp6:CGFloat = 0.0 
    var comp6a:CGFloat = 0.0 


    var scrollLayer : CAScrollLayer = { 
     let scrollLayer = CAScrollLayer() // 8 
     scrollLayer.bounds = CGRect(x: 0.0, y: 0.0, width: 150.0, height: 200.0) // 9 
     scrollLayer.position = CGPoint(x: 300/2, y: 180/2) // 10 //not sure about this 
     scrollLayer.borderColor = CGColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.8) 
     scrollLayer.borderWidth = 5.0 // 12 
     scrollLayer.scrollMode = kCAScrollHorizontally // 13 
     return scrollLayer 
    }() 

    var scrollTimer = Timer() 
    var layer = CALayer() 

    override func windowDidLoad() { 
     super.windowDidLoad() 
     MainWindowController.subWindowController = self // USED for midi 

     //Initialize midi client 
     var midiClient: MIDIClientRef = 0; 
     var inPort:MIDIPortRef = 0; 
     var src:MIDIEndpointRef = MIDIGetSource(0); 
     MIDIClientCreate("MidiTestClient" as CFString, nil, nil, &midiClient); 
     MIDIInputPortCreate(midiClient, "MidiTest_InPort" as CFString, MyMIDIReadProc, nil, &inPort); 
     MIDIPortConnectSource(inPort, src, &src); 

     //Set up layer 
     let img = NSImage(named: "smallSky.png") 
     let imageSize = img?.size 
     print (imageSize) 
     let layer = CALayer() 
     layer.bounds = CGRect(x: 0.0, y: 0.0, width: (imageSize?.width)!, height: (imageSize?.height)!) // 3 
     layer.position = CGPoint(x: (imageSize?.width)!/4, y: (imageSize?.height)!/2) // 4 
     layer.contents = img//5 


     myCustomView.layer?.addSublayer(scrollLayer) 
     scrollLayer.addSublayer(layer) 

     myCustomView.layer = scrollLayer 
     myCustomView.wantsLayer = true 

    }//EO Overide 


    @IBAction func runButton(_ sender: AnyObject) { 
     print("run") 
     //Sets of timer at very high Speed 
     scrollTimer = Timer.scheduledTimer(timeInterval: 0.0001, target: self, selector: #selector(MainWindowController.scrollLayerScroll as (MainWindowController) ->() ->()), userInfo: nil, repeats: true) 
    } 

    func scrollLayerScroll(){//FIRED START FROM RUN BUTTON 
     //Collects data from translation and only sends to newTranslation when number is different 
     comp6a = translation 
     if (comp6a != comp6){ 
      newTranslation = translation 
      print("newTranslation",newTranslation) 
      let newPoint = CGPoint(x: newTranslation,y:0.0) 
      scrollLayer.scroll(to: newPoint) 

     } 
     comp6 = comp6a 
    }//eo scrollLayerScroll 


    func playMidi(count:Int){ 

     let fromCountIndex = count // Gets 1 to 26 from midi 
     fromArray = pointArray[fromCountIndex] 
     translation = CGFloat(fromArray) 
    }//eo playMidi 

}//EnD oF thE wORld