如何创建包装 UIOffset 结构的 NSValue?

Posted

技术标签:

【中文标题】如何创建包装 UIOffset 结构的 NSValue?【英文标题】:How do you create an NSValue wrapping a UIOffset struct? 【发布时间】:2012-03-30 21:29:25 【问题描述】:

我正在尝试更改 UISegmentedControl 的文本阴影位置。为此,documentation 说我需要传入一个包装 UIOffset 结构的NSValue。

UITextAttributeTextShadowOffset
    Key to the offset used for the text shadow in a text attributes dictionary.
    The corresponding value is an instance of NSValue wrapping a UIOffset struct.
    Available in ios 5.0 and later.
    Declared in UIStringDrawing.h.

问题是NSValue 没有这样的 UIOffset 结构的包装方法 - 只需搜索文档即可。我看到很多sample code 使用这个不存在的功能。

[NSValue valueWithUIOffset:UIOffsetMake(0, 1)]

当我尝试运行它时它崩溃了。我不明白有多少示例代码可以运行它。

【问题讨论】:

【参考方案1】:

查看NSValue UIKit Additions,这是一个类别,除了其他有用的东西之外,它还添加了您所追求的-[NSValue valueWithUIOffset:] 方法。

【讨论】:

【参考方案2】:

它可能不在文档中,但它存在并且有效:

NSValue *uiOffsetValue = [NSValue valueWithUIOffset:UIOffsetMake(0, 1)];
NSLog(@"%@", uiOffsetValue);
// outputs "UIOffset: 0, 1"

你是什么意思,当你尝试运行它时它崩溃了?如果该方法不存在,那么它甚至不应该编译。如果您的应用程序编译但崩溃,则问题一定是其他原因。

【讨论】:

Xcode 只警告不要将未知消息传递给对象。当将未知消息传递给对象时,Objective-C 将在运行时崩溃。 真的吗?我有一个 vanilla Xcode 设置,如果我尝试使用未知方法,我会得到“选择器 'foo:' 的无已知类方法”,它甚至无法编译。 其实经过进一步测试。它只在我的 iOS 4 设备上崩溃。它适用于我的 iOS 5 设备。这是可以理解的,因为设置阴影位置仅在 5 上支持。但是关于为什么 valueWithUIOffset 不在文档中仍然是一个未解之谜。 它在文档中 - 请参见此处:developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/… 它还显示“在 iOS 5.0 及更高版本中可用”,这解释了它为什么会在您的 iOS 4 设备上崩溃。

以上是关于如何创建包装 UIOffset 结构的 NSValue?的主要内容,如果未能解决你的问题,请参考以下文章

OC动画:CAKeyframeAnimation

NSString - - 常用结构体与字符串之间的转化(打印时可用)

包装组织和项目结构设计

如何为在 C 中使用 C++ 代码创建包装器?

使包装内容响应的图像

如何以 clang 格式包装结构初始化程序?