【问题标题】:updating an oscillator frequency from out-of-viewController从 out-of-viewController 更新振荡器频率
【发布时间】:2016-04-17 17:48:18
【问题描述】:

在学习 iOS 时,我正在制作一个使用 AudioKit.io 播放音调的应用

当用户点击屏幕时,会绘制一个新的“键”,并根据其 X 位置设置振荡器的频率。

所以现在我希望用户能够拖动“键”并获得振荡器更新的频率。

我想这更像是一个项目组织/逻辑组织问题。

有:

  • ViewController.swift(制作振荡器并绘制按键:didTap、toggleSound)
  • CircularKeyView.swift(圆形键的属性:drawRect、didPan等)

来自 CircularKeyView.swift:

//PAN IT LIKE u FRYIN.
func didPan(panGR: UIPanGestureRecognizer) {

self.superview!.bringSubviewToFront(self)

var translation = panGR.translationInView(self)

self.center.x += translation.x
self.center.y += translation.y


panGR.setTranslation(CGPointZero, inView: self)

//so the coordinates can be updated when there's a pan
self.setNeedsDisplay() //updates the coordinates on a pan event
//updateOscillatorFrequency here?
}

来自循环键视图:

    ...
    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGR = UITapGestureRecognizer(target: self, action: "didTap:")
        self.view.addGestureRecognizer(tapGR)


        let mixer = AKMixer(oscillator, osc2)
        AudioKit.output = mixer
        AudioKit.start()
    }

    func didTap(tapGR: UITapGestureRecognizer) {

        let tapPoint = tapGR.locationInView(self.view)

        let newCircularKey = circularKeyView(origin: tapPoint)

        self.view.addSubview(newCircularKey)
        oscillator.frequency = Double(newCircularKey.center.x) * 2
    }

基本上,我的问题是:如何将平移行为与更改 viewController 中的变量(或变量数组/集合)联系起来?

【问题讨论】:

  • 我认为这是与代表一起完成的......所以我正在学习。可能会更新
  • 你有没有想过这个问题?我正在尝试更新使用 AKPropertySlider 播放的声音。我可以让变量更新,但我不知道如何更新正在播放的声音。
  • @Adrian 你好,Adrian 我已经很久没有看过这些材料了,但是是的,这是可能的。您可以使用代表和协议的东西。基本上,委托模式允许您创建在您的应用程序中全局存在的变量,并且任何实现“协议”的 swift 文件都可以在其更改时访问该变量,iirc。如果您需要帮助,我会破解我的旧代码并查看。

标签: ios swift


【解决方案1】:

我觉得创建UIPanGestureRecognizer、设置它并将其添加到您的视图(这里是您的CircularKeyView)应该是您的视图控制器的责任

它也应该是手势识别器的目标,因此它可以在自己的坐标系中设置视图的中心(视图更新自己的框架似乎很奇怪)。正如 Apple 的视图控制器编程指南所述:“视图控制器负责管理其视图层次结构”。

【讨论】:

  • 我尝试在 viewController 中制作 pan Gesture,但这并不是我所关注的教程中的布局方式。 weheartswift.com/bezier-paths-gesture-recognizers 此后我找到了一个很好的示例,详细说明了委派的工作原理stackoverflow.com/questions/34938682/… 并且我已经实现了所需的行为,其中滑动一个 CircularKeyViews(ViewController 的子视图)可以调整平移上的振荡器频率。 PanGesture 位于 CircularKeysView 中,委托处理更新的信息。
  • 很高兴它正在工作......但我仍然认为您可能希望转向更强大的设计,您的视图控制器负责移动子视图、附加和分离手势识别器以及管理您的音频振荡器。否则将很难处理各种情况:如果您平移出 View Controller 的视图边界怎么办?如果两个CircularKeyViews 手势识别器同时识别出一个平移,因为它们相互重叠怎么办?还有更多......视图应该对其环境非常不可知,并且最多应该使用它的bounds属性,而不是它的frame
  • 我可以补充一点,在某些情况下,处理手势识别器的视图是有意义的:当它与内部行为相关联时。一个很好的例子是滑块,它由诸如滑动旋钮之类的子视图组成。让它管理一个UIPanGestureRecognizer 是明智的,移动滑动旋钮并相应地修改它的值。
  • 感谢更新!我还在学习,尝试适当地布置设计很有趣。如果您可以对 iOS 项目组织有所了解……:每个键都会启动一个振荡器来播放音调。现在,AudioKit 很棒,但它的工作方式是有一些振荡器链接到 AudioKit.output,然后你执行 AudioKit.start() 不知何故我需要让所有振荡器对象能够一起播放,但也要动态可创建/可销毁,因为人们可以通过点击它们来删除圆形键.. 使用 NSMutableSet 有意义吗?
  • 我对 AudioKit 了解不多,但正如您所说,您的视图控制器应该保留所有播放振荡器的参考。 NSMutableSet 现在是 Objective-C 时代的遗物——现在你应该改用 Swift 列表。使用var oscillators = [AKOscillators]() 而不是let 可以立即使其可变,因此您可以使用append(anElement:)removeAtIndex(_:)
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 2013-09-18
  • 2015-11-30
相关资源
最近更新 更多