UI方向,又是苹果的一个未公开技巧

4
我在WWDC视频中看到了这个ui_orientation糖果,在此情境下使用。
UIImage *finalImage = [[UIImage alloc] initWithCGImage:cgimg
                      scale:2.0f orientation:ui_orientation([displayImage properties])];

显然它读取CCImage的方向以正确创建UIImage,但在我的代码上使用会产生此错误:implicit declaration of function 'ui_orientation' is invalid in C99。

你们知道我应该在源代码中包含哪个头文件才能使该函数起作用吗?

谢谢。

注意:WWDC 2012 - 课程510第25分16秒...当创建UIImage时。


4
你确定这是一个未记录的函数吗?我怀疑它只是一些快速编写的宏,定义在那个特定的示例代码中。如果你认为它是一个未记录的函数,那么你觉得为什么会有一个(公共的)头文件包含它呢? - user529758
1
如果在WWDC视频中作为代码示例展示,以指导开发人员如何做某事,那么它是公开的。 - Duck
2
由于它不在任何公共头文件中,我同意@H2CO3的观点,我认为那只是在特定演示中定义的一种通用函数/宏。 - Gabriele Petronella
1
看起来这个函数很可能并不存在(或者只存在于一些未发表的样例代码中作为一次性宏)。没有其他地方提到它,而且考虑到下一张幻灯片展示了一种更简短的实现方式,也许这张幻灯片上的代码只是用来说明一般原理,并不适合真正使用 - 即使第一行([CIContext context])也无法编译。 - omz
2
@大家好,我建议有人比我更清醒/更勤奋一些,运行“otool -tv | grep ui_orientation”命令来查看UIKit可执行文件。 - user529758
显示剩余3条评论
2个回答

6

这是来自第422个会话,他们提供了代码:

将方向属性转换为UIImageOrientation:

UIImageOrientation ui_orientation (NSDictionary* props)
{
    int o = [[props valueForKey:(id)kCGImagePropertyOrientation] intValue];
    UIImageOrientation map[] = {
        UIImageOrientationUp,
        UIImageOrientationUp, UIImageOrientationUpMirrored,
        UIImageOrientationDown, UIImageOrientationDownMirrored,
        UIImageOrientationLeftMirrored, UIImageOrientationRight,
        UIImageOrientationRightMirrored, UIImageOrientationLeft,
    };
    return map[o];
}

这里有一个有用的提示:下载所有WWDC会议的PDF并保存在您的硬盘上。它们不占用太多空间。这样,当您想找到哪个会话讨论CATransaction或者(就像这里一样)一个虚构的函数时,您可以使用Spotlight查找PDF,该PDF以会话编号为标题。


太好了,我已经接受这个答案。大问题是:这是否起作用?我的意思是,如果CIImage的方向确实在这个神秘的“属性”中,那么它显然是一个NULL NSDictionary(是的,我已经尝试过NSLog),也没有文档说明。此外,在视频中,那个人还提到了一个来自过滤器示例应用程序的样本代码,但在WWDC2012示例中没有找到。无论如何,你的答案很棒。 - Duck
非常好,我没有想到过搜索PDF文件。@RubberDuck properties 字典在 CIImage 头文件中有一些文档记录。如果它是 nilui_orientation 函数将返回 UIImageOrientationUp - omz

3
根据H2CO3的建议,我运行了。
otool -tv UIKit | grep ui_orientation

UIKit的路径在哪里?

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/System/Library/Frameworks/UIKit.framework

命令没有返回任何结果,因此我可以确认,在iOS SDK 6.1中,ui_orientation函数没有公共定义。那可能是为了特定示例而定义的宏,所以苹果没有明确说明,这真是太遗憾了。

我认为在某个时候,我们都习惯了苹果糟糕的文档,但是在2012年WWDC视频的第510课中,25'16"的这一帧获得了奖项。一个单独的帧具有未提及的宏定义,一行代码无法编译以及一个[displayImage properties],其中“properties”不在文档中,如果您尝试NSLog(它似乎是NSDictionary),它会给您null!哈哈哈...太棒了。这就是我所说的教程。 - Duck
1
那个教程可能存在一些问题,但如果你认为 Apple 的文档糟糕,我无法想象还有什么形容词足够糟糕来描述其他人的文档。 - Gabriele Petronella
苹果没有文档,他们只是把一堆东西堆在一起。偶尔他们会制作一份更好的、更好写的大型文档,但90%的文档都是垃圾。问题在于他们雇用极客来编写文档。极客知道如何做,却不愿意向凡人解释。他们应该雇用有教学经验的人,比如书籍作者。 - Duck
1
我强烈不同意。苹果的文档是我遇到过的最好的文档之一。我希望你永远不会发现自己需要挖掘安卓的文档的情况。 - Gabriele Petronella
我通过阅读书籍学习了所有的编程知识。从一本写得很好的书转向苹果出版物确实是一种震撼。写得好的书在每个API之后都会提供示例或解释API。尝试仅使用AVFoundation框架参考创建视频捕获应用程序吧,祝你好运。 - Duck
这只是苹果公司写的又一个糟糕文档的例子:https://developer.apple.com/library/ios/#technotes/iOSStaticLibraries/Articles/creating.html,因为它是错误的。就我所尝试的和网络上所有人说的,静态库不能在iOS上携带像图片这样的资源。您必须创建一个bundle并将资源添加到其中。这些糟糕文档最糟糕的事情是它们不是拼写错误,而是概念性错误。 - Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接