NSLog()使用毫秒级分辨率的时间戳,但是它是一个钝器,因为它的所有日志消息都处于警告级别.
Apple System Log是一个更细粒度的系统,有8个不同的级别.但是......它的时间戳只有1秒的分辨率.我阅读了有关时间格式的手册页,但它们似乎都只是第二种.
很明显,这些信息是可用的,至少对NSLog来说是这样.很多事情可以在一秒钟内继续下去; 有没有办法通过ASL获得更好的分辨率?
在最新的Apple文档中,CBC特性的UUID属性有一条线,并且表示它仅在5.0到7.1中可用.但是,您通常希望看到的"弃用"这个词无处可见.
更重要的是,没有任何关于我们如何识别特征的建议,例如当我们在委托方法中传递一个外设时:didUpdateValueForCharacteristic:.在该方法中,它是决定关键这我处理的特点.CBC特征实例的描述符成员是nil.那里还有什么?Apple如何打算让我们区分特征?UUID的重点是识别......
我在Apple Watch中触发了在后台播放文字转语音的间歇性(aargh!)问题.我已正确设置后台模式,AVSession类别和WatchKitExtensionRequest处理程序.(见下文.)我之前有过这个工作,并且无法弄清楚改变了什么.(可能是iOS 9有问题吗?"之前"意味着,除其他外,iOS 8.)
问题是:当应用程序从Watch获取请求并且应用程序在后台或手机处于休眠状态(已锁定)时,语音有时会立即播放,而其他时间则无法播放,直到应用程序被带来到前台.操作系统似乎有时排队音频,有时不排队.我在成功和失败案例之间找不到任何共同点.我可以登录,要speakUtterance()的调用验证是被造的所有情况.但它的行为有所不同,显然是随机的.唯一的线索是,可能是应用程序在后台运行的时间越长,立即说话的可能性就越小.
这让我脱掉头发.建议欢迎.
所需的背景模式:App使用AirPlay播放音频或流音频/视频
do {
try AVAudioSession.sharedInstance().setCategory(
AVAudioSessionCategoryPlayback,
withOptions:.DuckOthers
)
try AVAudioSession.sharedInstance().setActive(true)
} catch let error as NSError {
// etc...
}
Run Code Online (Sandbox Code Playgroud)
var bgTaskId:UIBackgroundTaskIdentifier = 0
bgTaskId = application.beginBackgroundTaskWithName(
"Prose WKE handler",
expirationHandler: {
application.endBackgroundTask(bgTaskId)
}
)
//... Post notification to call Text-to-Speech
application.endBackgroundTask(bgTaskId)
Run Code Online (Sandbox Code Playgroud) 我的代码片段非常小:
self.textField.textColor = color
Run Code Online (Sandbox Code Playgroud)
这是为响应用户交互而调用的.它已经工作多年了.在我的iOS 10设备上它仍然有效.在我的iOS 11设备上,在我点击文本字段之前,颜色不会改变.
错误?特征?解决方法?建议欢迎.
Apple文档(在Xcode和网页中)都没有任何参数说明。
https://developer.apple.com/documentation/foundation/1418095-nslocalizedstring
作为参考,功能签名为
NSLocalizedString(
_ key : String,
tableName: String? = default, // ??
bundle : Bundle = default,
value : String = default, // ????
comment : String
) -> String
Run Code Online (Sandbox Code Playgroud)
我不清楚这tableName是什么-但更多信息会有所帮助。(这仅仅是字符串文件的文件名吗?)我不知道这value是为了什么。
特尔;博士:
我无法在宽屏 (13:6) 手机上将图像准确地绘制到全屏上。如果我观察安全区域,错误是(可预测的)欠扫描。使用.edgesIgnoringSafeArea()(出乎意料地)在另一个方向上走得太远了。
更新
Apple DTS 建议这是一个错误,向我退还了一次支持事件,并邀请我提交错误报告。https://feedbackassistant.apple.com/feedback/8192204正在筹备中
警告讲师
我的假设.scaledToFill可能是错误的。我在最后解决这个问题。
代码
所以基本的我可以把它放在这里,它甚至不会减慢你的速度
struct ContentView: View {
var body: some View {
Image("testImage").resizable().scaledToFill()
// .edgesIgnoringSafeArea(.all)
}
}
Run Code Online (Sandbox Code Playgroud)
测试图像
测试图像是一个横向矩形,比例为 13:6,就像宽屏手机一样。(例如原始 iPhone X 的 812:375 比例。)灰色边缘不是图像的一部分。
它标有其子框架,对应于窄(旧)手机 (16:9) 和打击垫 (4:3)。
运行时结果
Xcode 项目设置明确仅限横向,适用于平板电脑和手机。
对于窄手机和所有键盘,上面的代码,观察安全区域,像我期望的那样呈现测试图像:
但是在宽屏手机上,我无法让红色矩形与屏幕边缘重合。
宽电话
随着无调用.edgesIgnoringSafeArea(),这是我们正在观察安全区域。自然地,我们的图像被映射到全屏的一个子集。
随着对 的调用.edgesIgnoringSafeArea()。我希望这能完全填满屏幕,但它会过度扫描:
这是 Xcode 视图层次结构调试器对上一个的看法:图像被映射到一个比全屏大的矩形。为什么?
事件顺序
如果我颠倒修饰符的顺序,并.edgesIgnoringSafeArea() 在之前 调用.scaledToFill(),我会得到纵横比失真,这.scaledToFill()应该可以防止。(请参阅屏幕截图中的圆变成椭圆。)解释这些操作是如何组成的,以及它们为什么不通勤,可能对回答我的主要问题大有帮助。
解决方法
我认为上述应该有效,我不明白为什么不行。什么做 …
我可以直接在 Swift 字符与其 Unicode 数值之间进行转换吗?那是:
var i:Int = ... // A plain integer index.
var myCodeUnit:UInt16 = myString.utf16[i]
// Would like to say myChar = myCodeUnit as Character, or equivalent.
Run Code Online (Sandbox Code Playgroud)
或者...
var j:String.Index = ... // NOT an integer!
var myChar:Character = myString[j]
// Would like to say myCodeUnit = myChar as UInt16
Run Code Online (Sandbox Code Playgroud)
我可以说:
myCodeUnit = String(myChar).utf16[0]
Run Code Online (Sandbox Code Playgroud)
但这意味着为每个字符创建一个新字符串。我已经这样做了数千次(解析文本),因此很多新字符串立即被丢弃。
let a:Character = "a" // Would not really be a literal in my app...
let b:Character = "b" // ...but this illustrates the issue
let compare = a == b
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:找不到接受提供的参数的 == 的重载。
尽管事实上如果你右键单击 Character 你可以很容易地找到这个声明
func ==(lhs: Character, rhs: Character) -> Bool
Run Code Online (Sandbox Code Playgroud)
有什么建议?我可以通过将字符分配给字符串并进行字符串比较来解决,但我正在迭代数千个字符。当然有一种快速的方式。
默认行高正好适合 42 毫米手表的四行。但是在 38mm 手表上,第四排被切断了。
在IB中,我检查了表格的通用“已安装”;对于图像(例如),这会导致自定义大小,但我没有看到表格行高的任何此类选项。或者我只是使用看起来像 Watch Size Classes 的东西,点击底部的“任何屏幕尺寸”?如果是这样,它将如何与“已安装”设置交互?
我打算四处走走,但一些 SmartPerson™ 可以通过指向正确的方向来提供很多帮助。
FWIW,我见过的所有 Apple 示例代码也都有“38mm 截止”问题。
长话短说
\n\n似乎无法使用绑定来告诉wrappedAVPlayer停止\xe2\x80\x94 为什么不呢?弗拉德的“一个奇怪的技巧” 对我来说很有效,没有状态和绑定,但为什么呢?
也可以看看
\n\n我的问题与此类似,但该海报想要包装一个AVPlayerViewController,我想以编程方式控制播放。
这家伙也想知道什么时候updateUIView()被叫到的。
发生了什么(控制台日志如下所示。)
\n\n使用如下所示的代码,
\n\n用户点击“去看电影”
\n\nMovieView出现并播放视频updateUIView(_:context:)被称为用户点击“返回主页”
\n\nHomeView再次出现updateUIView被呼叫。但是...删除该###行,然后
updateUIView抵达时会接到电话,但离开时不会接到电话如果您取消注释%%%代码(并注释掉其前面的内容)
长话短说:
我想在(父)状态发生变化时触发一个操作。这在声明性上下文中似乎很困难。
评论
这里的挑战是我并不试图使一种视图的属性依赖于另一种视图。这是一个覆盖良好的领域。我可以(并且已经)整天阅读有关共享状态更改的内容。但这是一个事件。
我遇到的最好的是arsenius的。他的方法确实有效。我想知道是否有一种更具反应性的方法来做到这一点。也许是一击Publisher?看起来很粗略。
代码
在 FRP 中,“事件”并不总是一个肮脏的词。我可以通过处理相同的View事件来启动动画: View
import SwiftUI
struct MyReusableSubview : View {
@State private var offs = CGFloat.zero // Animate this.
var body: some View {
Rectangle().foregroundColor(.green).offset(y: self.offs)
// A local event triggers the action...
.onTapGesture { self.simplifiedAnimation() }
// ...but we want to animate when parent view says so.
}
private func simplifiedAnimation() {
self.offs = 200
withAnimation { self.offs = …Run Code Online (Sandbox Code Playgroud) TL; 博士
我想推迟发表,但不知道如何,呃,把这些部分结合起来
简单来说
我有一个 Publisher
let generator = PassthroughSubject<Bool, Never>()
Run Code Online (Sandbox Code Playgroud)
并想以某种方式使用修饰符
.delay(for: 2, scheduler: RunLoop.main)
Run Code Online (Sandbox Code Playgroud)
所以当我打电话
generator.send(true)
Run Code Online (Sandbox Code Playgroud)
消息在呼叫后两秒发送 send()
查看文档Publishers.Delay使类型错误更加清晰,但并不能帮助我找到正确的连接方式。
代码
import SwiftUI
import Combine
// Exists just to subscribe.
struct ContainedView : View {
private let publisher: AnyPublisher<Bool, Never>
init(_ publisher: AnyPublisher<Bool, Never> = Just(false).dropFirst().eraseToAnyPublisher()) {
self.publisher = publisher
}
var body: some View {
Rectangle().onReceive(publisher) { _ in print("Got it") }
}
}
struct ContentView: View {
let generator = PassthroughSubject<Bool, Never>()
// .delay(for: 2, …Run Code Online (Sandbox Code Playgroud) 我为我的UIButton设置了自定义提示.我期望的是,当单击时,按钮将读取提示; 双击提示时不会发出声音,但会发生正常的按钮操作.
但实际上,在双击时再次读取提示,同时正常按钮动作发生.重新阅读会很烦人,但正常的动作是播放不同的声音.他们结合在一起.Yecch!
有人会认为UIAccessibilityTraitPlaysSound是可以使用的东西,但它没有效果.我可以使用AllowDirectInteraction,但会丢失提示.在任何情况下,重读双击提示都是错误的.恕我直言.