我正在开发我的第一个iOS应用程序,并且遇到了第一个问题我无法找到一个好的答案.
问题:我有一个自定义UIGestureRecognizer
并且所有连线都正确连接,我可以@selector
在识别后为每次触摸运行代码.这对大多数事情来说都很好,但对其他人来说这是一个太多的输入.
我的目标:制作一个以指定间隔触发的计时器来运行逻辑,并且能够在取消触摸时取消此计时.
我在这里问的原因:解决方案有很多可能性,但没有一个能够成为最好的解决方案.到目前为止似乎
performSelector
(以及对此的一些变化)NSThread
NSTimer
NSDate
从所有的研究来看,某种形式的线程似乎是可行的路线,但我不知道哪种方式最适合这种情况.
实现的示例:NSPoint
每0.10秒采用一次,并且采用前一点和当前点之间的距离.[取每个点之间的距离产生非常混乱的结果].
相关代码:
- (void)viewDidLoad {
CUIVerticalSwipeHold *vSwipe =
[[CUIVerticalSwipeHold alloc]
initWithTarget:self
action:@selector(touchHoldMove:)];
[self.view addGestureRecognizer:vSwipe];
[vSwipe requireGestureRecognizerToFail:doubleTap];
}
...
- (IBAction)touchHoldMove:(UIGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
}
if (sender.state == UIGestureRecognizerStateBegan) {
}
//other stuff to do goes here
}
Run Code Online (Sandbox Code Playgroud) MPMedia API 中的有趣错误
我的音乐应用程序中存在一个持续存在的错误,我现在终于找到了它(现在我正在快速重写它)。它有几个方面。(使用系统音乐播放器)
好吧,真是愚蠢又令人气愤。
现在回答我的问题:
对于无法知道云项目是否在设备上(通过 iTunes)的情况,我无能为力。但是,我/应该/能够过滤掉某个项目是否具有 assetURL,这保证了它是本地的且可用。
let filter:MPMediaPropertyPredicate = MPMediaPropertyPredicate(value: "ipod", forProperty: MPMediaItemPropertyAssetURL, comparisonType: MPMediaPredicateComparison.Contains)
Run Code Online (Sandbox Code Playgroud)
这将返回 0 个项目。有谁知道过滤此属性的方法?在这里这样做似乎是最干净的,并且应该让查询返回 items 和 itemSections。我的所有表都是从查询中填充的,我认为没有一种方法可以手动重建表。
URL 的格式如下:ipod-library://item/item.m4a?id=5314739480586915369
现在,我怀疑在填充表视图等时可以添加捕获,但感觉真的很混乱。
这是 ios 9.2.1、Swift 2、Xcode 7.2.1
我还没有擦手机并重新复制歌曲。如果 assetURL 不存在,则从音乐应用程序手动下载它们是项目获取 assetURL 的唯一方法。
通过以下代码,我得到了输出音量,但实际上是不一致的-有时它给出相同的值,有时尽管系统音量实际上正确更改,但后面却有音量变化。
有什么办法让它每次输出正确的值?
func viewDidLoad() {
...
NotificationCenter.default.addObserver(self, selector: #selector(volumeDidChange), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
...
}
func volumeDidChange() {
print("VOLUME CHANGING", AVAudioSession.sharedInstance().outputVolume)
// output while changing the volume with hardware buttons
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.0625
VOLUME CHANGING 0.125
VOLUME CHANGING 0.1875
VOLUME CHANGING 0.25
VOLUME CHANGING 0.375
VOLUME CHANGING 0.375
VOLUME CHANGING 0.4375
VOLUME CHANGING 0.5
VOLUME CHANGING 0.5625
VOLUME CHANGING 0.625
VOLUME CHANGING 0.6875
VOLUME CHANGING 0.75
VOLUME CHANGING 0.8125
VOLUME CHANGING 0.875
VOLUME CHANGING 0.75
VOLUME …
Run Code Online (Sandbox Code Playgroud) Swift中的代码
...
var time:timeval?
gettimeofday(UnsafePointer<timeval>, UnsafePointer<()>) // this is the method expansion before filling in any data
...
Run Code Online (Sandbox Code Playgroud)
目标C中的代码
...
struct timeval time;
gettimeofday(&time, NULL);
...
Run Code Online (Sandbox Code Playgroud)
我一直在试图找到有关UnsafePointer的更多信息以及传递NULL的替代方法,但我可能正在咆哮错误的树.
如果有人知道如何在Swift中使用等效代码,那就太好了.如果有一个很好的解释,它会发生什么,甚至更好!
ios ×3
swift ×3
gettimeofday ×1
mpmediaitem ×1
mpmediaquery ×1
nsdate ×1
nsthread ×1
nstimer ×1
null ×1
objective-c ×1