许多Cocoa Touch类利用了合并事件的设计模式.UIViews中,例如,有一种方法setNeedsLayout,其使得layoutSubviews在不久的将来将被调用.这在许多属性影响布局的情况下尤其有用.在您可以调用的每个属性的setter中[self setNeedsLayout],将确保更新布局,但如果一次更改多个属性,或者即使在一次迭代中多次修改单个属性,也会阻止布局的许多(可能是昂贵的)更新运行循环.其他昂贵的操作,如setNeedsDisplay和drawRect:一对方法遵循相同的模式.
实现这样的模式的最佳方法是什么?具体来说,我想将一些依赖属性绑定到一个昂贵的方法,如果属性发生了变化,每次迭代运行循环需要调用一次.
可能的解决方案:
使用CADisplayLink或者NSTimer你可以得到这样的工作,但两者似乎都比必要的更多涉及我不确定将这个添加到许多对象(特别是计时器)的性能影响.毕竟,性能是做这样的事情的唯一原因.
在某些情况下我使用过这样的东西:
- (void)debounceSelector:(SEL)sel withDelay:(CGFloat)delay {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:sel object:nil];
[self performSelector:sel withObject:nil afterDelay:delay];
}
Run Code Online (Sandbox Code Playgroud)
这在用户输入应该仅在连续动作或类似事件时触发某些事件的情况下工作得很好.当我们想要确保触发事件没有延迟时,我们只想在同一个运行循环中合并调用,这似乎很笨拙.
在iOS应用,我跑在一个相当大的脚本UIWebView使用stringByEvaluatingJavaScriptFromString(在JavaScript字符串的长度方面大).在调用javascript导致屏幕上的其他元素打嗝一会儿后,有一个短暂的停顿.
将javascript调用放在后台调用的函数中self performSelectorInBackground会中断应用程序.有没有一种安全的方法可以在后台线程上调用run或者阻止接口暂停?
是否有可能迫使a UIFont等宽?
具体来说,我使用的字体不包含等宽数字(表格数字).创建一个等宽的修改后的字体对象,并将该字体添加到属性字符串的数字段中,效果很好.
另一种解决方案可能是将自定义属性添加到属性字符串,并修改处理文本布局的内容,以便在特定范围内使用固定大小的字形.
有一些问题是提出通过覆盖解决类似问题-drawRect:或-drawTextInRect:在UILabel(参见:是否有可能改变与可可触摸字体的字母间距/字距?).这似乎是一个疯狂的解决方案,如果字符串混合使用等宽字体和非等宽字体,那将会非常复杂.
还有许多问题建议,特别是关于数字,创建具有启用某些字体特征的字体描述符的字体.(请参阅在iOS上显示按比例分隔的数字(而不是等宽/表格)).这似乎只适用于包含这些功能的字体.我使用的字体不包括这些功能,它们没有任何效果.可以使用类似的东西来检查字体功能NSLog(@"%@", CTFontCopyFeatures ( ( __bridge CTFontRef ) myFont ));
如何设置单元测试来测试添加到以前只有Objective-c项目的Swift类?
我已经为我的项目添加了Swift类,并且能够在其他Swift和Objective-c文件中使用它们.但是,我无法从我的测试类中访问它们.
我认为正确的import语句是@testable import MyAppModuleNameXcode模板中添加到示例测试类的内容.该行产生的错误是Cannot import module being compiled.使用Swift 2在Xcode 7中出现此错误.
在iPad应用程序中,无论用户在哪里触摸屏幕,我都想显示图像,突出显示他们正在触摸的点.该应用程序包含许多嵌套视图,所有这些视图都应接收触摸并正常运行.
看似简单,但我找不到一个好方法.使用touches began: with event根视图控制器上的相关功能不起作用,因为如果触摸子视图,则不会触发事件.我还创建了一个"虚拟"手势识别器,它只是将触摸事件传递给另一个绘制图像的类.这很好用,按钮工作,但打破UIScrollViews,我猜测其他子视图与手势重新配置.
是否有无处你可以访问所有不影响触摸事件,其中的触摸被向何处去?
谢谢.
如何在Swift中处理与NSCoding相关的错误?
使用init?(coder:)它初始化对象时,如果数据无效,则可能无法初始化.我想抓住这些错误并妥善处理它们.为什么init?(coder:)在Swift中没有定义为抛出函数?
如何扩展swift数组以访问特定类型的成员?
如果数组包含从同一个超类继承的多个类的实例,则这是相关的.理想情况下,它会适当地强制执行类型检查.
使用该filter(_:)方法工作正常,但确实强制类型安全.例如:
protocol MyProtocol { }
struct TypeA: MyProtocol { }
struct TypeB: MyProtocol { }
let myStructs:[MyProtocol] = [ TypeA(), TypeA(), TypeB() ]
let filteredArray = myStructs.filter({ $0 is TypeA })
Run Code Online (Sandbox Code Playgroud)
在filteredArray包含了正确的价值观,但类型仍然[MyProtocol]没有[TypeA].我希望更换最后一个let filteredArray = myStructs.filter({ $0 is TypeA }) as! [TypeA]可以解决这个问题,但项目失败了EXEC_BAD_INSTRUCTION,我不理解.也许类型转换阵列是不可能的?
理想情况下,此行为可以包含在数组扩展中.以下内容无法编译:
extension Array {
func objectsOfType<T:Element>(type:T.Type) -> [T] {
return filter { $0 is T } as! [T]
}
}
Run Code Online (Sandbox Code Playgroud)
这里似乎至少有两个问题:类型约束T:Element似乎不起作用.我不确定基于泛型类型添加约束的正确方法是什么.我的意图是说T …
objective-c ×5
ios ×4
swift ×3
cocoa-touch ×2
arrays ×1
cocoa ×1
generics ×1
ipad ×1
nscoding ×1
uifont ×1
uitouch ×1
uiwebview ×1
unit-testing ×1
xcode ×1