2017-03-25 1 views
1

Im utilisant Scroll View pour faire défiler une image. J'utilise un curseur 1 - 26 pour récupérer CGPoint d'un tableau pour les points de l'axe x. Tout se comporte comme prévu et l'image est lisse en transition.Swift Scroll View avec curseur et MIDI

J'ai également mis en place un bouton qui, lorsqu'il est pressé, compte de 1 à 26 et boucle pour récupérer CGPoint d'un tableau pour les points de l'axe x. Tout se comporte comme prévu et l'image est lisse en transition.

J'ai également mis en place un MIDI qui envoie les données 1 - 26 en fonction de la vélocité, cela est envoyé au curseur, et le curseur se déplace comme prévu. J'utilise également le MIDI pour récupérer CGPoint à partir d'un tableau pour les points de l'axe x. Malheureusement, bien qu'il veut faire défiler les images ci-dessous montre ce qui vous arrive obtenez seulement pour voir 4 images comme il défile et vous pouvez dire par le curseur en mouvement quand ils apparaissent

Under Midi Control

Je suis très confiant que le Midi fonctionne correctement car je l'utilise tout le temps pour lire des tableaux. J'ai aussi essayé de déclencher le bouton de Midi une sorte de presse virtuelle. Cela fonctionne comme prévu mais montre la même chose que de déclencher directement à partir de midi. Il semble que tout va bien tant que le parchemin provient d'un composant IB.

Sous Midi contrôlent la barre de défilement bégaie aussi, mais si je mets

clipView.wantsLayer = true 

L'image ne défile pas sous midi, mais la barre de défilement se déplace comme prévu. Même si le curseur et le bouton fonctionnent comme prévu.

J'ai aussi essayé toutes les choses commentées dans le playMidi. Aussi bien essayer tous les différents paramètres dans la section IB.

Je suis à un point où je pourrais vraiment faire avec de l'aide s'il vous plaît. Voici mon code qui, je l'espère, explique aussi ce que j'ai essayé. J'ai également essayé divers

needsDisplay = true 

sur toutes les vues

Xcode 8 swift3 OSX pas iOS

Merci pour votre temps

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 

Répondre

0

Suite à mon code comme ci-dessus je pas répondu à la question, mais à la place trouvé un "se déplacer". Je ne suis vraiment pas fier de cela, mais cela semble poser une question que peut-être quelqu'un pourrait aider à répondre. Comme le code ci-dessus utilisant la vue Scroll ne fonctionnait pas, j'ai plutôt essayé d'utiliser CAScrollLayer.

La configuration de base est la suivante. J'ai une vue à l'intérieur de cette vue, j'ai créé un calque de défilement et à l'intérieur d'un calque. Encore une fois comme ci-dessus si j'utilise une minuterie pour déclencher la vue défilement tout fonctionne parfaitement. Et encore comme ci-dessus si j'utilise Midi alors le défilement ne se produit pas. Donc, le travail autour est. Le midi 1-26 lit la valeur du point mais au lieu d'essayer de l'envoyer au scroll il l'envoie à une variable de transition.

J'ai un "bouton d'exécution" sur l'interface cela fonctionnerait normalement le scrollLayerScroll. Il le fait toujours mais à une vitesse incroyable. Mais au lieu de générer sa propre variable de transition, elle utilise celle créée pour acheter la fonction midi. Il y a un morceau de code qui s'assure que seul un nombre unique est envoyé au point.

Cela fonctionne mais mérite vraiment un prix pour le pire morceau de codage jamais.

Je pense qu'il y a quelque chose dans la façon dont la minuterie rafraîchit tout ce dont j'ai besoin d'extraire. Je quelqu'un peut encore prendre espérais pitié et aider

merci encore

voici le code révisé Xcode 8 swift3 OSX pas 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