2017-03-25 71 views
1

使用滾動查看滾動圖片。我正在使用滑塊1 - 26從x軸點的數組中檢索CGPoint。一切都如預期的那樣運行,圖像平滑過渡。滑塊和MIDI快速滾動查看

我還設置了一個按鈕,當按下按鈕從1到26計數並循環以從x軸點的陣列檢索CGPoint。一切都如預期的那樣運行,圖像平滑過渡。

我還設置了MIDI發送數據1 - 26基於速度這發送到滑塊,滑塊移動如預期。我還使用MIDI從x軸點數組中檢索CGPoint。不幸的是,雖然它要滾動下面的圖片顯示會發生什麼你只有看到3張圖片,因爲它滾動,你可以通過移動滑塊告訴當他們出現

Under Midi Control

我非常有信心的是,迷笛工作正常,因爲我一直使用它來讀取數組。我也曾嘗試觸發Midi的一種虛擬媒體按鈕。這按預期工作,但顯示與從MIDI直接觸發相同。似乎一切都很好,只要滾動源自IB組件即可。

根據MIDI控制滾動條也口吃,但如果我設置

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

而且我的代碼如上我有沒有回答這個問題,而是找到了一個「解決問題」。我真的不爲此感到自豪,但它似乎提出了一個問題,也許有人可能會幫助回答。由於上述使用Scroll View的代碼無法正常工作,我嘗試使用CAScrollLayer。

基本設置如下。我在視圖內部有一個視圖,我創建了一個滾動圖層,並在圖層內部。再次如上所述,如果我使用計時器來觸發滾動視圖,則一切正常。再次如上所述,如果我使用Midi,那麼滾動不會發生。所以解決的辦法是。 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