2017-03-25 3 views
1

スクロール表示を使って画像をスクロールします。私は、スライダ1〜26を使用して、x軸点の配列からCGPointを取得しています。すべてが期待どおりに動作し、画像は移行時に滑らかです。スウィフトスクロールスライダーとMIDIでの表示

また、ボタンを1から26まで数えてループさせて、x軸点の配列からCGPointを取得するボタンを設定しました。すべてが期待どおりに動作し、画像は移行時に滑らかです。

また、これはスライダに送られる速度に基づいてデータ1〜26を送信するMIDIをセットアップし、スライダは期待どおりに動きます。また、MIDIを使用して、x軸の点の配列からCGPointを取得します。以下の画像をスクロールさせたいが、残念ながら、あなただけそれがスクロールするよう4つの画像を見ることが、彼らは

Under Midi Control

表示されたときに、私はミディ、非常に自信を持って移動するスライダーで伝えることができ、何が起こるかを示し配列から読み込むために常に使用しているので、正しく動作しています。私はまた、ミディからバーチャルプレスの一種のボタンをトリガーしようとしました。これは期待通りに機能しますが、midiから直接トリガするのと同じことを示します。スクロールがIBコンポーネントから発生している限り、すべてが正常であるように見えます。ミディの下

は、スクロールバーも吃音コントロールするが、私は

clipView.wantsLayer = true 

を設定した場合、期待通りの写真は、MIDIが、スクロールバーを移動下にスクロールしません。スライダーとボタンは期待どおりに機能します。

また、私はplayMidiでコメントアウトされたすべてのものを試しました。同様にIBセクションのすべての異なるパラメータを試してください。

私は本当に助けてくださいできる点にあります。 ここに私が試したことがうまくいけば私のコードです。私が持っている上記のよう 私もすべてのビューに

needsDisplay = true 

様々な試みている

Xcodeの8 Swift3 OSXないのiOS

は私のコードに時間あなたのためさらに

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 

答えて

0

をありがとう質問に答えなかったが、代わりに "周りを回る"ことが分かった。私は本当にこれを誇りに思っていませんが、誰かが答えるのに役立つかもしれないという疑問を提起しているようです。スクロールビューを使用して上記のコードが動作していなかったので、代わりにCAScrollLayerを使用してみました。

基本的な設定は次のとおりです。私はそのビューの内側にビューを持っています。スクロールレイヤーを作成し、その内部にレイヤーを作成しました。前述のように、スクロールビューを起動するタイマーを使用すると、すべてが完全に機能します。そして、私がミディを使用すれば上記のように再びスクロールは起こらない。だから、回避策はあります。 midi 1-26は点の値を読み込みますが、スクロールに送る代わりにトランジション変数に送ります。

私は、通常はscrollLayerScrollを動作させるインターフェースに「実行ボタン」を持っています。それでも、これは信じられないほどのスピードで行われます。しかし、独自の遷移変数を生成する代わりに、作成した遷移変数を使用してmidi関数を購入します。一意の番号だけがポイントに送信されるようにするコードがあります。

これは機能しますが、実際には最悪のコーディングの賞品に値するものです。

私はタイマーが私が抽出する必要があるすべてをリフレッシュする方法に何かがあると思う。私は誰かがまだ同情を取り、

おかげでここ

再び

を助けるかもしれ改訂コードXcodeの8 Swift3 OSXをされることを望んではないの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