有时您会看到正在使用的"时钟擦除"动画.像这样的东西:

你会如何在iOS中实现这种效果?
(注意:这个问题是一个"振铃器".我想分享一种创建时钟擦除动画的技术,但是SO没有共享教程的格式,所以我最接近的是问一个问题,然后提供答案这是故意的,并试图分享其他人可能觉得有用的信息.)
我正在学习斯威夫特.
这些天我主要在iOS工作,但我目前正在为OS X开发一个小项目.
在OSX上,我喜欢使用Cocoa绑定将我的模型中的值链接到UI元素.它节省了大量的胶水代码.
我正在编写一个程序,将Swift的性能与C/Objective-C的性能进行比较.我正在使用素数生成器作为测试项目.
我创建了一个Swift Struct ComputeSettings,它封装了在Swift和Objective-C中运行素数生成器的设置(和结果).结构看起来像这样:
struct ComputeResults
{
var totalCalculated: Int = 0
var primesPerSecond: Int = 0
var totalTime: NSTimeInterval = 0
}
struct ComputeSettings
{
var totalToCalculate: Int = 10000000
var swiftResults: ComputeResults = ComputeResults()
var objCResults: ComputeResults = ComputeResults()
}
Run Code Online (Sandbox Code Playgroud)
然后我在视图控制器中有一个ComputeSettings类型的实例变量:
class ViewController: NSViewController
{
var theComputeSettings = ComputeSettings()
var foo: Int = 12
//...
}
Run Code Online (Sandbox Code Playgroud)
在我的UI中,我有一个文本字段,允许用户输入要计算的素数的数量.在IB中,我选择字段,在实用程序区域中选择绑定选项卡,然后打开值绑定.我绑定了我的ViewController班级.我输入了一个模型关键路径self.theComputeSettings.totalToCalculate.
当我运行我的项目时,它失败并出现异常:
无法在(NSWindow)上设置(contentViewController)用户定义的检查属性:[addObserver:forKeyPath:@"theComputeSettings.totalToCalculate"选项:256上下文:0x0]被发送到与"theComputeSettings"属性不符合KVC的对象.
相反,如果我绑定到dummy属性foo(因此模型键路径设置为self.foo),它完美地工作.在那种情况下,我看到我的文本字段显示我的值12.
有没有办法使用Swift结构并仍然可以使Cocoa绑定工作?我做了相当多的谷歌搜索,但找不到任何东西.
我当然可以用手动方式来做,并编写一堆粘合代码来将我的结构中的值安装到我的窗口视图中,但我更喜欢使用Cocoa绑定.这就是他们的目的.
在Objective-C中,所有对象都可以被视为类型id,几乎所有对象都从NSObject继承.(块没有,但这是唯一的例外.)
因此,可以创建一个扩展所有Objective-C对象的Objective-C类别.(忽略块)
在Objective-C中,我创建了一个NSObject的扩展,它使用关联的对象来选择将字典附加到任何NSObject.这使我能够实现方法setAssocValue:forKey:,并assocValueForKey:使得它可以将一个键/值对附加到任何NSObject的.这在很多情况下都很有用.
例如,它可以将存储的属性添加到类别中.您只需编写一个使用相关值方法附加存储对象的getter/setter,然后就可以了.
它还可以在运行时将值附加到现有系统对象.您可以在按钮上挂起数据或代码块,或者执行您需要执行的操作.
我想在Swift中做同样的事情.
但是,Swift没有像Objective-C那样的所有对象的公共基类.AnyObject并且Any是protcols.
从而,
extension AnyObject
Run Code Online (Sandbox Code Playgroud)
不会编译.
我不知道在Swift中"附加"我setAssocValue:forKey:和assocValueForKey:方法的位置.
我可以为我的扩展创建一个基类,但这违背了使用扩展的要点.我可以使我的基础对象成为Objective-C NSObject,但这意味着我的所有对象必须是NSObjects,默认情况下Swift对象不是NSObjects.
(顺便说一下,这个问题适用于Mac OS和iOS平台)
我想将view1的高度设置为所有设备屏幕高度的一半(当设备处于纵向模式时)
这是我想要的样子:
所以我做了View1高度的自动布局
@IBOutlet weak var heighConstraint: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)
我的viewwillappear函数在这里:
override func viewWillAppear(animated: Bool) {
self. heighConstraint.constant = self.view.frame.size.height / 2
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的应用程序时,它不起作用.这里有什么不对?
在Swift中,您可以使用if allow可选绑定将可选项解包为具有相同名称的常量或变量:
func test()
{
let a: Int? = 1
if let a = a {
print("a = \(a)")
}
}
Run Code Online (Sandbox Code Playgroud)
对于if let语句中的所有内容,可选项将a被解包为常规int.
同样,我可以使用guard语句来达到类似的效果
func test()
{
let a: Int? = 1
guard let requiredA = a else{
return
}
print("a = \(requiredA)")
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能使用这样的代码guard let a = a else::
func test()
{
let a: Int? = 1
guard let a = a else{
return
}
print("a = \(a)")
}
Run Code Online (Sandbox Code Playgroud)
为什么不?
在guard语句中,如果guard语句的条件失败,则执行else子句并退出当前作用域.如果条件成功,则从guard语句的右括号创建一个新的变量/常量到当前作用域的末尾.
为什么我不能将可选项映射到当前作用域的其余部分的同名变量/常量?
PS: …
我刚刚发现了Swift zip功能.这似乎非常有用.
它需要2个输入数组,并从每个数组的值对中创建一个元组数组.
是否有zip的变体采用任意数量的数组并输出具有相同数量元素的元组?似乎应该有办法做到这一点.
我正在将我的代码从 Objective C 转换为 Swift。我有一个从 swift 方法调用客观 C 方法的代码。obj C 方法返回一个 NSDictionary。显然 Swift 将这个对象视为一种类型[AnyHashable : Any]。我如何阅读这种类型的信息?例如,对于 NSDictionary,我会说NSString *s = [dict objectForKey:"key"]. 我在 Swift 中调用什么来访问 type 中的值[AnyHashable : Any]?
谢谢
苹果文档对于设备的 deviceToken 何时可以更改有点模糊。防御性地编写代码并测试该代码是值得的。
我已经编写了我的应用程序,以便在启动时注册推送通知并处理didRegisterForRemoteNotificationsWithDeviceToken回调。
我didRegisterForRemoteNotificationsWithDeviceToken将最后一个设备令牌保存到用户默认值,如果令牌仍然相同,则继续。如果它根本没有保存的令牌,或者令牌不匹配,它会将新令牌上传到我们的服务器。
我还有一种机制,可以让我用人类可读的名称来命名我的测试设备,例如“4s_1”“5s_1”“5s_2”等。我有一个服务器命令行工具,它采用人类可读的设备名称,查找设备的从中查找“identifierForVendor”,然后使用标识符查找设备令牌。然后它会触发沙箱通知。
删除应用程序并重新安装似乎会导致“identifierForVendor”发生变化,但不会发生变化deviceToken,这与我希望测试发生的情况完全相反。我想要一些永远不会改变的值来唯一标识测试设备,并更改设备令牌,以便我可以测试我的代码。
编辑:自从写这篇文章以来,我已经更改了应用程序以生成它自己的 UUID 并将其保存到钥匙串中,正如 Wain 在他的回答中所建议的那样。
有没有办法强制 Apple 的 APN 更改设备的令牌,以便我可以测试我的代码(客户端和服务器端)来处理令牌更改的情况?
NSFormatter 有很多专门的子类:
CNContactFormatter
CNPostalAddressFormatter
DRMSFFormatter
MKDistanceFormatter
NSByteCountFormatter
NSDateComponentsFormatter
NSDateFormatter
NSDateIntervalFormatter
NSEnergyFormatter
NSLengthFormatter
NSMassFormatter
NSNumberFormatter
NSPersonNameComponentsFormatter
Run Code Online (Sandbox Code Playgroud)
我们大多数人都使用过NSNumberFormatter和NSDateFormatter。它们具有 locale 属性,可让您指定在将字符串转换为/从格式化程序支持的“本机”格式时要使用的语言环境。其他一些喜欢NSDateComponentsFormatter从他们的属性之一继承他们的语言环境(NSDateComponentsFormatter使用指定日历的语言环境,如果有的话。)
大多数其他人似乎没有任何方法来指定语言环境。我能想到的让它们以特定语言/区域设置生成输出的唯一方法是设置系统区域设置,获取输出/将字符串转换为数字格式,然后将其设置回来。
有没有办法为格式化程序设置语言环境NSByteCountFormatter,但似乎不提供任何类型的语言环境设置?
我只是试图通过单击添加断点,然后对其进行编辑并在Condition字段中输入表达式来在XCODE GUI中创建条件断点。但是,断点总是触发。
我最终将其精炼为进入条件字段true或false进入条件字段,即使这样也不起作用。
奇怪的是,在同一(混合的Swift / Objective-C)项目中的Objective-C行上设置条件断点确实可以工作。
在我看来,断点位于您的Swift源代码中时,断点条件将被完全忽略。
其他开发人员是否也遇到相同的问题?是否有一些“秘诀”可以使我想念的Swift断点正常工作?
swift ×6
ios ×5
macos ×2
xcode ×2
animation ×1
autolayout ×1
devicetoken ×1
methods ×1
nsformatter ×1
oop ×1
struct ×1