小编and*_*lin的帖子

收听iOS应用中的所有触摸事件

有可能以某种方式听取并捕获应用程序中发生的所有触摸事件吗?

我正在开发的应用程序将用于展厅和信息亭,因此如果在给定的几分钟内没有收到任何触摸,我想恢复到应用程序的开始部分.一种屏幕保护功能,如果你愿意的话.我打算通过在后台运行一个计时器来实现这一点,每当应用程序中的某个地方发生触摸事件时,应该重置并重新启动计时器.但是我怎么能听听触摸事件呢?任何想法或建议?

events objective-c touch ios

21
推荐指数
2
解决办法
1万
查看次数

使用Firebase对多个值进行过滤和排序

我正在使用Firebase构建社交应用.我在Firebase中存储帖子,如下所示:

posts: {
   "postid": {
      author: "userid" 
      text: "",
      date: "timestamp"
      category: "categoryid"
      likes: 23
   }
}
Run Code Online (Sandbox Code Playgroud)

每个帖子属于一个类别,可以喜欢帖子.

现在,我正在尝试显示属于特定类别的帖子,按喜欢的数量排序.我可能还希望按日期限制过滤器,以仅显示类别中最近,最喜欢的帖子.我怎样才能做到这一点?

Firebase查询功能似乎不支持这样的多个查询,这看起来很奇怪......

firebase

12
推荐指数
1
解决办法
1万
查看次数

当应用程序处于后台时,hasDifferentColorAppearance 为真

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,在暗模式和亮模式之间切换时清除一些缓存等。

出于某种原因traitCollectionDidChangehasDifferentColorAppearance每次我的应用程序处于后台时都会触发并评估为 true,无论我是否在设备上启用了暗模式。在这种情况下,previousTraitCollection 和当前 traitCollection 似乎从来没有匹配的 interfaceStyles。如果 userInterfaceStyle 实际上没有改变,我宁愿避免在 userInterfaceStyle 改变时进行更新。

这是一个错误,还是我只是错过了什么?

uitraitcollection ios13 ios-darkmode

7
推荐指数
1
解决办法
539
查看次数

在显示键盘时,在iPad上的表单中调整tableview的大小

我在调整桌面视图时遇到困难,当键盘出现时滚动到活动文本字段,当视图以模态方式显示在iPad上的表单中时.它在iPhone上工作正常,因为我不必考虑表单视图的偏移量 - 我可以将tableview的底部contentInset更改为与键盘高度相同.但是,这不适用于iPad,因为表单及其表格视图不占用整个屏幕.

计算tableview的新底部contentInset应该是多少的最佳方法是什么?

objective-c uitableview ios

6
推荐指数
1
解决办法
2125
查看次数

一个xib,几个子类

我有一个用于自定义 UIView 子类的 xib 文件。工作正常。我能够加载正确的 nib 并创建我的类的实例,它包含我添加到 xib 文件中的所有子视图。

但是,我也对该视图进行了子类化,但我不知道如何创建此类的实例并让它使用父类使用的 xib 文件。这可能吗?我不想为我的子类创建一个新的 xib 文件,因为视图层次结构、子视图和 GUI 看起来相同,只是代码不同。

我可以加载一个笔尖并将其“连接”到另一个类,而不是在 xib 设置中指定为“自定义类”的类吗?或者我可以创建视图的新实例并告诉它使用特定名称的 xib 吗?

xcode objective-c interface-builder xib ios

5
推荐指数
1
解决办法
1070
查看次数

使用后删除 AVAudioPlayerNode 会导致崩溃

我用来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)

实现这样的功能(即在录制时播放多个文件(可能彼此重叠))的最佳方法是什么?

ios avaudioengine

5
推荐指数
1
解决办法
1113
查看次数

AVAudioEngine可录制麦克风和声音文件,避免反馈循环

我正在尝试使用AVAudioEngine来录制麦克风和声音文件(当用户点击按钮时播放的声音).我已将mic inputNode连接到mainMixer,以及一些用于播放声音文件的AVAudioPlayerNodes.我在mainMixer上安装了一个水龙头来捕获声音并将其写入文件.声音也会传送到扬声器.

这是我的音频图的基本布局:

         -------------
mic  --> |           |
         | mainMixer | --> speaker
file --> |           |
         -------------
               |
              tap
        (writes to file)
Run Code Online (Sandbox Code Playgroud)

默认情况下,声音通过接收器/耳机扬声器而不是iPhone底部的扬声器播放.

不幸的是,这意味着通过扬声器输出的声音太低而且难以听到 - 我希望用户能够在播放和录制时听到声音文件.所以我希望通过底部扬声器播放声音效果.

如果我改变音频会话以使用底部扬声器进行播放,我会得到一个反馈循环,因为麦克风输入和底部扬声器播放的声音再次由麦克风拾取.(奇怪的是,这适用于iPad,没有创建反馈循环.当然,iPad没有耳机,因此在该设备上,声音总是通过主扬声器听到.)

我有两个问题:

  1. 是否可以仅将声音文件路由到底部扬声器?我不想通过任何扬声器输出麦克风的声音.但是,应记录麦克风和声音文件的声音.

  2. 为什么我在iPhone上获得反馈循环但不在iPad上?是否可以通过底部扬声器输出所有声音而无需获得反馈回路?

audio avfoundation ios avaudioengine

5
推荐指数
0
解决办法
549
查看次数

即使文件存在,AVAudioFile.length也为0

我正在创建一个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

好的,所以经过一些建议我做了一些改变.基本上,这些是我正在采取的步骤:

  1. 检查文件是否已存在.
  2. 如果是,打开它进行读取并获取音频缓冲区.
  3. 创建一个用于写入的新文件(使用相同的文件URL)
  4. 使用writeFromBuffer将缓冲区从旧文件写入新文件
  5. 将新文件的framePosition移动到最后,以便我可以继续写入/记录它.

但是,写入后,新文件的长度为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)

core-audio swift avaudioengine avaudiofile

5
推荐指数
1
解决办法
1377
查看次数

将单声道 AVAudioPCMBuffer 写入立体声 AVAudioFile

我正在使用 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)

如果我将音频转换为立体声,一切正常。

ios avaudioengine avaudiopcmbuffer avaudiofile

5
推荐指数
0
解决办法
1744
查看次数

无法创建Google Analytics配置文件

我正在将Google Analytics添加到我的iOS应用中,并且SDK中似乎有一些更改.https://developers.google.com/analytics/devguides/collection/ios/v3/上的教程说我必须创建一个配置文件,但是当我点击"获取配置文件"链接时我会被定向到一个只显示加载微调器的页面(在浏览器控制台上打印了一些错误).

我没有时间等待谷歌修复他们的服务,所以我想知道是否可以手动创建文件?

google-analytics ios

4
推荐指数
1
解决办法
818
查看次数

使用GPUImage将图像添加到视频

我正在尝试使用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)

objective-c ios gpuimage

1
推荐指数
1
解决办法
4874
查看次数

在Swift中从URL删除所有路径组件

我有一个包含许多路径组件的URL。是否有删除所有路径组件的好方法?基本上,我只想保留方案和URL的主机。以及端口(如果有)。

我当然可以使用现有URL的相关属性来创建新的URL对象:

let newURL = "\(existingURL.scheme!)://\(existingURL.host!)"
Run Code Online (Sandbox Code Playgroud)

或循环遍历pathcomponents,删除最后一个组件,直到没有剩余。

但是,这两种解决方案似乎都不那么优雅,因此我正在寻找一种更好,更安全,更有效的解决方案。

url nsurl ios swift

1
推荐指数
1
解决办法
1948
查看次数