Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从UIColor获取重复图案的大小?_Iphone_Ios_Quartz Graphics_Uicolor - Fatal编程技术网

Iphone 从UIColor获取重复图案的大小?

Iphone 从UIColor获取重复图案的大小?,iphone,ios,quartz-graphics,uicolor,Iphone,Ios,Quartz Graphics,Uicolor,我可以通过检查它所包装的CGColor实例来查询UIColor是否是模式,CGColorGetPattern()函数返回模式(如果它存在),或者null返回模式(如果它不是模式颜色) CGPatternCreate()方法需要一个bounds当创建图案时,该值定义图案平铺的大小(用石英术语称为单元) 创建后,如何从UIColor或背景CGPattern检索此图案大小 似乎没有任何方法可以直接从CGPatternRef检索任何信息 如果必须这样做,可能唯一的方法(除了戳CGPattern结构的私有

我可以通过检查它所包装的
CGColor
实例来查询
UIColor
是否是模式,
CGColorGetPattern()
函数返回模式(如果它存在),或者
null
返回模式(如果它不是模式颜色)

CGPatternCreate()
方法需要一个
bounds
当创建图案时,该值定义图案平铺的大小(用石英术语称为单元)


创建后,如何从
UIColor
或背景
CGPattern
检索此图案大小

似乎没有任何方法可以直接从CGPatternRef检索任何信息


如果必须这样做,可能唯一的方法(除了戳CGPattern结构的私有内容之外,这可能被视为“使用私有API”)是将模式呈现到足够大的图像缓冲区,然后检测重复的子单元。这可能是一个很好的起点。

我认为不可能从CGPatternRef获取边界,如果这是您所要求的

创建自己的颜色类来存储边界并允许您通过属性访问它们可能是一个可行的解决方案


从UIColor中提取模式边界似乎是不可能的。

如果您的应用程序仅用于内部分发,那么您可以使用私有API。如果查看CoreGraphics框架中定义的函数,您将看到有一组函数,其中一个函数名为
cgpattergetbounds

otool -tV /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics | egrep "^_CGPattern"
您只需在框架上进行一些函数查找,并通过函数指针使用它

标题包括:

#include <dlfcn.h>
用于检索函数的代码:

void *handle = dlopen("/System/Library/Frameworks/CoreGraphics.framework/CoreGraphics", RTLD_NOW);
CGPatternGetBounds getBounds = (CGPatternGetBounds) dlsym(handle, "CGPatternGetBounds");
用于检索边界的代码:

UIColor *uicolor = [UIColor groupTableViewBackgroundColor]; // Select a pattern color
CGColorRef color = [uicolor CGColor];
CGPatternRef pattern = CGColorGetPattern(color);
CGRect bounds = getBounds (pattern); // This result is a CGRect(0, 0, 84, 1)

有没有关于我将如何着手并深入研究内部的线索?这适用于内部分发的应用程序,而不是应用商店上的应用程序。您必须找到struct CGPattern的声明,或者只检查调试器中的内存。然后希望他们不要在未来版本的框架中更改布局。
UIColor *uicolor = [UIColor groupTableViewBackgroundColor]; // Select a pattern color
CGColorRef color = [uicolor CGColor];
CGPatternRef pattern = CGColorGetPattern(color);
CGRect bounds = getBounds (pattern); // This result is a CGRect(0, 0, 84, 1)