我做了CALayer
一个添加CATextLayer
,文字出来模糊.在文档中,他们谈论"亚像素抗锯齿",但这对我来说并不重要.任何人都有一个代码片段,CATextLayer
使用一些明确的文本?
以下是Apple文档中的文字:
注意:CATextLayer在渲染文本时禁用子像素抗锯齿.只有在光栅化的同时将文本合成到现有的不透明背景中时,才能使用子像素抗锯齿来绘制文本.在将背景像素编织成文本像素之前,无法单独绘制子像素抗锯齿文本,无论是图像还是图层.将图层的opacity属性设置为YES不会更改渲染模式.
第二句话暗示一个人可以获得好看的文本,如果composites
它变成一个existing opaque background at the same time that it's rasterized.
很好的,但我如何合成它,你如何给它一个不透明的背景,你如何光栅化它?
他们在Kiosk菜单示例中使用的代码是这样的:(它是OS X,而不是iOS,但我认为它有效!)
NSInteger i;
for (i=0;i<[names count];i++) {
CATextLayer *menuItemLayer=[CATextLayer layer];
menuItemLayer.string=[self.names objectAtIndex:i];
menuItemLayer.font=@"Lucida-Grande";
menuItemLayer.fontSize=fontSize;
menuItemLayer.foregroundColor=whiteColor;
[menuItemLayer addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMaxY
relativeTo:@"superlayer"
attribute:kCAConstraintMaxY
offset:-(i*height+spacing+initialOffset)]];
[menuItemLayer addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMidX
relativeTo:@"superlayer"
attribute:kCAConstraintMidX]];
[self.menuLayer addSublayer:menuItemLayer];
} // end of for loop
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑:添加我实际使用的代码导致文本模糊.这是来自我发布的一个相关问题,即添加一个UILabel
而不是一个CATextLayer
但是得到一个黑盒子. http://stackoverflow.com/questions/3818676/adding-a-uilabels-layer-to-a-calayer-and-it-just-shows-black-box
CATextLayer* upperOperator = [[CATextLayer alloc] init];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGFloat components1[4] = {1.0, 1.0, …
Run Code Online (Sandbox Code Playgroud) 那里有许多不同的解析算法(递归下降,LL(k),LR(k),LALR,......).我发现很多关于不同语法的信息,不同类型的解析器都可以接受.但它们在运行时行为方面有何不同?哪种算法更快,使用更少的内存或堆栈空间?
或者换句话说 - 哪种算法表现最好,假设语法可以用于任何算法?
我正在使用块从a NSFileHandle
(从a NSPipe
)读取数据readabilityHandler
:
fileHandle.readabilityHandler = ^( NSFileHandle *handle ) {
[self processData: [handle availableData]];
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,我得到了我期望提供给我的processData
方法的所有数据.问题是我需要知道何时读取了最后一块数据.如果它到达文件结尾,availableData
则应返回一个空NSData
实例,但问题是在EOF上不再调用可达性处理程序.
我找不到任何关于如何在EOF上获得某种通知或回调的信息.那我错过了什么?Apple是否真的在没有EOF回调的情况下提供异步读取API?
顺便说一下,我不能使用基于runloop的readInBackgroundAndNotify
方法,因为我没有可用的runloop.如果我无法使用NSFileHandle
API,我可能会直接使用调度源来执行IO.
我有一个应用程序,其中我有一些视频和音频和一些inapp purchase.all r伟大的模拟器和工作完美.但昨天我已经创建了一个应用程序,并试图在它上面运行崩溃.错误报告是
malloc: *** error for object 0x165060: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
任何人都可以知道解决方案.我不知道哪里出错了,在模拟器中它工作得很好.任何人都可以帮助我吗?
我有一个类似于以下内容的NSArray:
6/1/13 | Data
6/2/13 | Data
7/1/13 | Data
9/1/13 | Data
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式获得创建节标题的月份 - 但前提是它们在数组中然后将日期分解为适当的部分.看起来像:
(Section Header)June 2013
6/1/13 | Data
6/2/13 | Data
(Section Header)July 2013
7/1/13 | Data
(skips august as no dates from august are in array)
(Section Header)September 2013
9/1/13 | Data
Run Code Online (Sandbox Code Playgroud)
我试图实现:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return @"June 2013";
}
Run Code Online (Sandbox Code Playgroud)
但显然需要使用数组中的任何月份动态更新.日期实际上是数组中的NSDates - 如果这有任何区别.
我是一个试图签署iOS应用程序的Windows用户 - 首先进行测试,稍后我将不得不签署发布到应用程序商店.一如既往,我被困在某个地方.
我尝试了:我在Xcode中打开*.xcodeproj文件,转到常规 - >签名,它告诉我
找不到帐户
添加开发者帐户以对您的应用进行签名
[添加帐户...]
所以我点击按钮,打开"帐户"窗口,打开对话框
使用Apple ID
登录Xcode使用Apple ID 登录Xcode.没有Apple ID?你可以免费创建一个.
Apple ID密码(忘记密码)
[______] [______]
[创建Apple ID] [取消] [登录]
在它后面的窗口中,Apple ID已经可见.我的Apple ID.
但我当然可以再次输入.或者不,哎哟:
账户已存在.
此帐户已添加
[确定]
此外,我无法将帐户从帐户窗口拖到签名窗口,更不用说使用上下文菜单.
如何将已添加的帐户添加到"签名"中?
我决定在我的项目中添加单元测试,并以测试驱动的方式继续开发.我目前正在为ManageSieve客户端对象实现单元测试,我不确定测试该野兽的最佳方法是什么.
我的SieveClient
对象依赖于对网络通信的其他两个对象:CocoaAsyncSocket
和我自己的SaslConn
目标,这是我周围的赛勒斯SASL库来处理身份验证方法包装.为了测试,我需要用模拟对象替换它们.我将使用OCMock框架.我不太清楚如何做到这一点,因为SieveClient对象需要自己创建这些对象.现在我覆盖该对象的(私有)setter,以便始终使用OCMocks partialMockForObject:
方法安装我的模拟对象.但这对我来说不合适.有什么想法可以更好地解决这个问题?
我遇到的另一个问题是套接字本身.为了能够测试协议细节,我需要一种从套接字返回预定义测试数据的方法.我想我可以使用OCMock机制伪造套接字的返回值.但是由于CocoaAsyncSocket
提供了许多不同的方法来从套接字读取数据,我必须准确地知道协议对象使用哪种顺序.我不希望我的单元测试依赖于我的协议对象的实现细节.那我该怎么办?手动为套接字类实现模拟对象?这似乎并不重要,所以我可能也需要进行单元测试.这是一个好主意吗?
我读过,如果有些东西很难测试,它的设计可能也不是很好.但我不知道我怎么能做得更好,因为困难的部分在于我必须做的插座交互.
如果您想查看代码,可以在Bitbucket找到它:SieveClient.m和SieveClient.h
所以我读到了依赖注入,我想我将使用它来将对象AsyncSocket
和SaslConn
对象放入我的SieveClient
对象中.我将更改我的构造函数以接受这些对象并使用它们.由于这个类的用户通常不关心套接字和SASL对象,我将添加一个工厂方法(以方便构造函数的形式),只创建这些对象并将它们传递给构造函数.
但这只解决了我测试问题的第一个(也更容易)部分.
如果场景中没有动画,有没有办法强制SCNView按需渲染新帧?如果场景是静态的,SCNView只会呈现一次,然后才会发生变化.
通常这是有道理的,但我正在与Vuforia增强现实框架一起工作,这需要我每次处理来自相机的新视频帧时渲染新的帧.我通过使用CAEAGLLayer创建自己的UIView来解决这个问题,该CAEAGLLayer使用SCNRenderer呈现SceneKit内容.这很好用,但我很好奇是否有办法用SCNView做到这一点,所以我可以避免直接触摸OpenGL ES.
Cocoa异常策略背后的基本原理是什么 - 或者为什么仅为程序员错误使用异常?
我知道异常过去相当昂贵,所以人们不想过度使用它们.但随着现代运行时的变化而变化,这是零成本的例外.我也明白使用异常来做一般控制流并不是一个好主意,因为它可能会导致代码难以理解.
但为什么要使用异常来发出程序员错误的信号呢?对于那种情况,记录后面的消息abort()
就足够了.我为什么要编写一个@catch(...)
块来处理程序员错误而不是修复实际错误?我一直在考虑这个问题,而且我没有找到任何合理使用程序员错误的异常.
(作为旁注/问题:我编写了一个递归下降解析器,我正计划在那里使用异常来处理错误.对我来说似乎比在那里为每个函数添加一个out参数更合理.并在任何地方手动检查错误.当然,我会抓住任何异常,我会抛出从外部调用的顶级方法.有人认为这对异常有用吗?)
谢谢你到目前为止的所有答案.他们都是真的,但他们实际上并没有回答我的问题.所以我想我并不是很清楚,对不起.所以这是真正的问题:
为什么Cocoa会抛出程序员错误(或断言)的异常?一个人不应该抓住它们,并且实际上编写在调用堆栈中某处处理程序员错误的代码无论如何都不是一个好主意.在我看来,例外是浪费精力.只需记录错误和调用abort()
(退出程序)就足够了.那么实际抛出异常的优点是什么?
我理解为什么通常不使用和不鼓励异常--Cocoa的大多数部分都不是例外安全的.这不是问题.我希望我现在明白这一点.
我有一个小值类,我创建了很多实例.通常具有相同的价值.此类用作一种标识符,因此主要用于比较此类的实例(via isEqual:
).
为了节省一些内存和时间比较,我只保留a中的唯一实例,NSHashTable
而不是使用指针比较isEqual:
.
所以我指定的初始化程序如下所示:
- initWithStuff: (NSString *)stuff;
{
self = [super init];
if (!self) return nil;
// ... (actual initialisation code omitted)
hash = UniquingHashTable();
static OSSpinLock spinlock = OS_SPINLOCK_INIT;
OSSpinLockLock( &spinlock );
id member = [hash member: self];
if (member) self = member;
else [hash addObject: self];
OSSpinLockUnlock( &spinlock );
return self;
}
Run Code Online (Sandbox Code Playgroud)
UniquingHashTable()
返回全局NSHashTable
或通过[NSHashTable weakObjectsHashTable]
它创建它,如果它还不存在.这weakObjectsHashTable
是重要的一点 - 它存储了对象的弱指针,一旦没有对该对象的其他强引用,它就会被自动删除.由于初始化是线程安全的dispatch_once
.
这工作正常,峰值内存使用率显着降低,我的所有测试用例仍然通过.但我不太确定我是否可以依靠指针比较来测试相等性.是否有任何情况或竞争条件,我同时得到两个不同的实例(所以指针是不同的)但他们仍然比较相等isEqual:
?
特定
MyClass …
Run Code Online (Sandbox Code Playgroud) 我正在使用Core Data和一个预先填充的Store,其中一个实体具有二进制数据和外部存储复选框,可以在外部保存一些大图像,每次我在模拟器中运行应用程序并执行一个获取请求时,一个名为"A"的新文件夹由AppName保存的文档"内部文档已创建.
该文件夹包含我在运行应用程序时获取的一些图像.
问题是这个文件夹在应用程序终止时没有删除,并且应用程序的大小目前正在增加几GB!
我已经使用启用了Core Data的默认Xcode模板启动了这个项目.
我错过了什么 ?
是否有更短的方法为谓词等效于此编写格式字符串:
[NSPredicate predicateWithFormat: @"key1 CONTAINS[cd] %@ OR key2 CONTAINS[cd] %@ OR key3 CONTAINS[cd] %@", searchString, searchString, searchString];
Run Code Online (Sandbox Code Playgroud)
我已经编写了一些这样的谓词格式字符串,我正在考虑通过编写一个方法来简化它,该方法采用一系列关键路径和搜索字符串来构造这样的谓词.但在我这样做之前,我想我会问是否有内置方法可以做到这一点.
期望:我试图能够在 ContactsUI 中选择多个联系人,如下所示:
正如您从下面的代码中看到的,我正在使用 contactPickerView,所以我不知道我做错了什么:/
import UIKit
import ContactsUI
import Contacts
class FindContactsVC: UIViewController, CNContactPickerDelegate {
//button to open contactUI
@IBAction func contactsButton(_ sender: Any) {
let cnPicker = CNContactPickerViewController()
cnPicker.delegate = self
self.present(cnPicker, animated: true, completion: nil)
}
//Works, but only allows me to select one at a time
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
print(contact.phoneNumbers)
print("WYASDFY")
}
//This function never runs :/
func contactPicker(picker: CNContactPickerViewController, didSelectContacts contacts: [CNContact]){
print(contacts)
print("plz work!")
contacts.forEach { contact in …
Run Code Online (Sandbox Code Playgroud) ios ×7
objective-c ×6
cocoa ×5
macos ×2
algorithm ×1
calayer ×1
code-signing ×1
core-data ×1
exception ×1
ipad ×1
iphone ×1
nsarray ×1
nsfilehandle ×1
nspredicate ×1
ocmock ×1
parsing ×1
scenekit ×1
sockets ×1
swift ×1
text ×1
uitableview ×1
unit-testing ×1
xcode ×1