有可能以某种方式听取并捕获应用程序中发生的所有触摸事件吗?
我正在开发的应用程序将用于展厅和信息亭,因此如果在给定的几分钟内没有收到任何触摸,我想恢复到应用程序的开始部分.一种屏幕保护功能,如果你愿意的话.我打算通过在后台运行一个计时器来实现这一点,每当应用程序中的某个地方发生触摸事件时,应该重置并重新启动计时器.但是我怎么能听听触摸事件呢?任何想法或建议?
我正在使用Firebase构建社交应用.我在Firebase中存储帖子,如下所示:
posts: {
"postid": {
author: "userid"
text: "",
date: "timestamp"
category: "categoryid"
likes: 23
}
}
Run Code Online (Sandbox Code Playgroud)
每个帖子属于一个类别,可以喜欢帖子.
现在,我正在尝试显示属于特定类别的帖子,按喜欢的数量排序.我可能还希望按日期限制过滤器,以仅显示类别中最近,最喜欢的帖子.我怎样才能做到这一点?
Firebase查询功能似乎不支持这样的多个查询,这看起来很奇怪......
Apple 建议我们使用traitCollectionDidChangehasDifferentColorAppearance 来使用和比较特征集合,以捕捉何时切换暗模式,并在需要时对其进行操作。像这样:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if #available(iOS 13.0, *) {
let hasUserInterfaceStyleChanged = previousTraitCollection?.hasDifferentColorAppearance(comparedTo: traitCollection) ?? false
if (hasUserInterfaceStyleChanged) {
//Update UI
}
}
}
Run Code Online (Sandbox Code Playgroud)
我用它来更新 UI,在暗模式和亮模式之间切换时清除一些缓存等。
出于某种原因traitCollectionDidChange,hasDifferentColorAppearance每次我的应用程序处于后台时都会触发并评估为 true,无论我是否在设备上启用了暗模式。在这种情况下,previousTraitCollection 和当前 traitCollection 似乎从来没有匹配的 interfaceStyles。如果 userInterfaceStyle 实际上没有改变,我宁愿避免在 userInterfaceStyle 改变时进行更新。
这是一个错误,还是我只是错过了什么?
我在调整桌面视图时遇到困难,当键盘出现时滚动到活动文本字段,当视图以模态方式显示在iPad上的表单中时.它在iPhone上工作正常,因为我不必考虑表单视图的偏移量 - 我可以将tableview的底部contentInset更改为与键盘高度相同.但是,这不适用于iPad,因为表单及其表格视图不占用整个屏幕.
计算tableview的新底部contentInset应该是多少的最佳方法是什么?
我有一个用于自定义 UIView 子类的 xib 文件。工作正常。我能够加载正确的 nib 并创建我的类的实例,它包含我添加到 xib 文件中的所有子视图。
但是,我也对该视图进行了子类化,但我不知道如何创建此类的实例并让它使用父类使用的 xib 文件。这可能吗?我不想为我的子类创建一个新的 xib 文件,因为视图层次结构、子视图和 GUI 看起来相同,只是代码不同。
我可以加载一个笔尖并将其“连接”到另一个类,而不是在 xib 设置中指定为“自定义类”的类吗?或者我可以创建视图的新实例并告诉它使用特定名称的 xib 吗?
我用来AVAudioEngine播放声音文件并将输出记录到文件中。我有很多音效文件,每个音效文件都是通过点击按钮来播放的。为了播放该文件,我创建了一个AVAudioPlayerNode并将其连接到引擎。文件播放后,我尝试断开/分离completionHandler 闭包中的节点,以释放内存。如果我不删除节点,我将继续向引擎添加新节点和新连接。
但是,下次我尝试播放文件时,应用程序就会冻结。这是我的代码:
let url = NSBundle.mainBundle().URLForResource(name, withExtension: "wav")!
let audioPlayerFile = try AVAudioFile(forReading: url)
let playerNode = AVAudioPlayerNode()
self.engine.attachNode(playerNode)
self.engine.connect(playerNode, to: self.engine.mainMixerNode, format: audioPlayerFile.processingFormat)
playerNode.scheduleFile(audioPlayerFile, atTime: nil, completionHandler: { () -> Void in
self.engine.disconnectNodeOutput(playerNode)
self.engine.detachNode(playerNode)
})
playerNode.play()
Run Code Online (Sandbox Code Playgroud)
实现这样的功能(即在录制时播放多个文件(可能彼此重叠))的最佳方法是什么?
我正在尝试使用AVAudioEngine来录制麦克风和声音文件(当用户点击按钮时播放的声音).我已将mic inputNode连接到mainMixer,以及一些用于播放声音文件的AVAudioPlayerNodes.我在mainMixer上安装了一个水龙头来捕获声音并将其写入文件.声音也会传送到扬声器.
这是我的音频图的基本布局:
-------------
mic --> | |
| mainMixer | --> speaker
file --> | |
-------------
|
tap
(writes to file)
Run Code Online (Sandbox Code Playgroud)
默认情况下,声音通过接收器/耳机扬声器而不是iPhone底部的扬声器播放.
不幸的是,这意味着通过扬声器输出的声音太低而且难以听到 - 我希望用户能够在播放和录制时听到声音文件.所以我希望通过底部扬声器播放声音效果.
如果我改变音频会话以使用底部扬声器进行播放,我会得到一个反馈循环,因为麦克风输入和底部扬声器播放的声音再次由麦克风拾取.(奇怪的是,这适用于iPad,没有创建反馈循环.当然,iPad没有耳机,因此在该设备上,声音总是通过主扬声器听到.)
我有两个问题:
是否可以仅将声音文件路由到底部扬声器?我不想通过任何扬声器输出麦克风的声音.但是,应记录麦克风和声音文件的声音.
为什么我在iPhone上获得反馈循环但不在iPad上?是否可以通过底部扬声器输出所有声音而无需获得反馈回路?
我正在创建一个AVAudioFile,用于将声音写入声音文件.如果文件已经存在,我想将framePosition移动到文件的末尾,以便在最后继续写入,而不是替换现有文件.
我做了一些测试,尝试将文件中的缓冲区读入一个具有不同URL的新文件,以便它不会覆盖原始文件.当我尝试将缓冲区读入新文件时,我遇到了崩溃:
let audioFile = try AVAudioFile(forReading: [URL to existing .caf file])
let audioFrameCount = AVAudioFrameCount(UInt32(audioFile.length))
let audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: audioFrameCount)
let newAudioFile = try AVAudioFile(forWriting: [another URL], settings: self.engine.mainMixerNode.outputFormatForBus(0).settings)
try newAudioFile.readIntoBuffer(audioBuffer, frameCount: audioFrameCount!) <-- CRASHES ON THIS LINE
Run Code Online (Sandbox Code Playgroud)
崩溃日志:因未捕获的异常'com.apple.coreaudio.avfaudio'而终止应用程序,原因:'error -50'
伙计,我真的很讨厌CoreAudio崩溃日志.他们绝对没有告诉我!
是不是可以将数据读入为写入而创建的文件中?
UPDATE
好的,所以经过一些建议我做了一些改变.基本上,这些是我正在采取的步骤:
但是,写入后,新文件的长度为0.
这是我的代码:
//Check if a file already exists. If so continue to record at the end of it
var audioBuffer : AVAudioPCMBuffer!
var audioFrameCount : AVAudioFrameCount!
if (NSFileManager.defaultManager().fileExistsAtPath(self.audioRecordURL.path!)) …Run Code Online (Sandbox Code Playgroud) 我正在使用 AVAudioEngine 录制音频,并将其保存为声音文件。
用户可以选择导入音频文件,然后如果愿意,可以在此文件的末尾继续录制。我通过将导入的文件读入 AVAudioPCMBuffer 来获取音频数据,然后将其写入要录制的文件中。如果导入的文件是立体声的(因为我正在写入的文件也是立体声的),这非常有用。但是,如果导入的文件是单声道的,当我尝试将 AVAudioPCMBuffer 写入文件时,代码会崩溃,仅仅是因为通道数不匹配。
是否可以将处理格式设置为立体声的单声道 AVAudioPCMBuffer 读入 av AVAudioFile 中?我可以将缓冲区转换为立体声吗?
以下是我如何从导入的文件中获取音频缓冲区的示例:
let existingAudioFile = try AVAudioFile(forReading: existingFileUrl)
var audioFrameCount = AVAudioFrameCount(existingAudioFile.length)
let audioBuffer = AVAudioPCMBuffer(PCMFormat: existingAudioFile.processingFormat, frameCapacity: audioFrameCount) //Mono
try existingAudioFile.readIntoBuffer(audioBuffer)
Run Code Online (Sandbox Code Playgroud)
这就是我使用 AVAudioEngine 创建 AVAudioFile 的地方:
self.audioFile = try AVAudioFile(forWriting: self.audioRecordURL, settings: self.engine.mainMixerNode.outputFormatForBus(0).settings) //This is in stereo
Run Code Online (Sandbox Code Playgroud)
最后,这就是我将音频缓冲区写入文件的方式:
try self.audioFile.writeFromBuffer(audioBuffer)
Run Code Online (Sandbox Code Playgroud)
如果我将音频转换为立体声,一切正常。
我正在将Google Analytics添加到我的iOS应用中,并且SDK中似乎有一些更改.https://developers.google.com/analytics/devguides/collection/ios/v3/上的教程说我必须创建一个配置文件,但是当我点击"获取配置文件"链接时我会被定向到一个只显示加载微调器的页面(在浏览器控制台上打印了一些错误).
我没有时间等待谷歌修复他们的服务,所以我想知道是否可以手动创建文件?
我正在尝试使用GPUImage库为视频的每个帧添加图像,但无法使其工作.出于某种原因,处理后的视频仅包括原始视频,没有图像叠加.我究竟做错了什么?
GPUImagePicture *overlay = [[GPUImagePicture alloc] initWithImage:[UIImage imageNamed:@"overlayimage"] smoothlyScaleOutput:YES];
[overlay processImage];
GPUImageMovie *movie = [[GPUImageMovie alloc] initWithURL:[THE URL TO THE VIDEO ASSET]];
movie.delegate = self;
movie.runBenchmark = YES;
movie.playAtActualSpeed = YES;
self.movieView = [[GPUImageView alloc] initWithFrame:self.bounds];
self.movieView.fillMode = kGPUImageFillModePreserveAspectRatio;
[self addSubview:self.movieView];
GPUImageAlphaBlendFilter *filter = [[GPUImageAlphaBlendFilter alloc] init];
[movie addTarget:filter atTextureLocation:0];
[overlay addTarget:filter atTextureLocation:1];
[filter prepareForImageCapture];
[filter addTarget:self.movieView];
[movie startProcessing];
Run Code Online (Sandbox Code Playgroud) 我有一个包含许多路径组件的URL。是否有删除所有路径组件的好方法?基本上,我只想保留方案和URL的主机。以及端口(如果有)。
我当然可以使用现有URL的相关属性来创建新的URL对象:
let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"
Run Code Online (Sandbox Code Playgroud)
或循环遍历pathcomponents,删除最后一个组件,直到没有剩余。
但是,这两种解决方案似乎都不那么优雅,因此我正在寻找一种更好,更安全,更有效的解决方案。
ios ×9
objective-c ×4
avaudiofile ×2
swift ×2
audio ×1
avfoundation ×1
core-audio ×1
events ×1
firebase ×1
gpuimage ×1
ios-darkmode ×1
ios13 ×1
nsurl ×1
touch ×1
uitableview ×1
url ×1
xcode ×1
xib ×1