Objective c 比较两种UIColor(点击UIImageView中的位置与资源目录颜色)

Objective c 比较两种UIColor(点击UIImageView中的位置与资源目录颜色),objective-c,xcode,uicolor,cgcolorspace,Objective C,Xcode,Uicolor,Cgcolorspace,我需要点击一个UIImageView 。。。并将点击位置的颜色与从资源目录返回的颜色(或在代码中创建的自定义颜色)进行比较 我在颜色空间方面遇到了很多问题,我的匹配总是不匹配。我读了一些关于stackoverflow的好例子,并尝试过它们,但我肯定还是做错了什么 我使用 我还尝试使用如下自定义颜色(而不是资源颜色): +(UIColor*)主题化{ 返回[UIColor COLOR WITH RED:192.0f/255.0f green:92.0f/255.0f blue:42.0f/

我需要点击一个
UIImageView

。。。并将点击位置的颜色与从资源目录返回的颜色(或在代码中创建的自定义颜色)进行比较

我在颜色空间方面遇到了很多问题,我的匹配总是不匹配。我读了一些关于stackoverflow的好例子,并尝试过它们,但我肯定还是做错了什么

  • 我使用
我还尝试使用如下自定义颜色(而不是资源颜色):

+(UIColor*)主题化{
返回[UIColor COLOR WITH RED:192.0f/255.0f green:92.0f/255.0f blue:42.0f/255.0f alpha:1];
}
还是没有火柴。我的匹配测试代码如下:

-(无效)点击颜色视图:(UITapGestureRecognitizer*)点击识别器{
CGPoint接触点=[点击识别器位置查看:uiiv_hs];
//NSLog(@“我的颜色%@,[uiiv_hs colorOfPoint:touchPoint]);
UIColor*color=[uiiv_hs COLOROOFPOINT:接触点];
NSLog(@“color%@,[uiiv_hs colorOfPoint:touchPoint]);
UIColor*matchcolor=[UIColor主题化];
NSLog(@“mcolor%@,[UIColor主题化]);
NSArray*colors=[NSArray arrayWithObjects:[UIColor colorNamed:@“Color01”],[UIColor colorNamed:@“Color02”],nil];
如果([颜色匹配颜色:匹配颜色错误:nil]){
NSLog(@“1匹配!”);
}否则{
NSLog(@“1不匹配!”);
}
如果([color isEqualToColor:[UIColor主题化]]){
NSLog(@“2Match!”);
}否则{
NSLog(@“2不匹配!”);
}
}

如果您不熟悉以下主题,请不要这样做。我将向你们展示一种方法,一种非常简单的方法,但会有一些陷阱

资源 需要提前阅读或至少了解/熟悉的内容

  • 颜色相关
    • (特别是)
  • 浮动相关
问题#1-您想要哪种颜色? 您的
UIImageView
可以是完全不透明、透明、部分不透明、透明等。。。假设
UIImageView
下面有一个黄色视图,
UIImageView
不是不透明的,alpha设置为50%。你想要什么颜色的?原始图像颜色?渲染颜色(与黄色混合)

我猜是和黄色混在一起的。下面是获得正确颜色的代码

目标C:

界面UIView(ColorAtPoint) -(UIColor*)colorAt:(CGPoint)点; @结束 @实现UIView(ColorAtPoint) -(UIColor*)颜色在:(CGPoint)点{ UIView*TargetPaqueView=self; 而(!targetOpaqueView.isOpaque&&targetOpaqueView.superview!=nil){ targetPaqueView=targetPaqueView.superview; } CGPoint targetPoint=[自转换点:点到视图:目标到视图]; 无符号字符像素[4]={0}; CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); if(colorSpace==NULL){ 返回零; } CGContextRef context=CGBitmapContextCreate(像素,1,1,8,4,颜色空间,(CGBitmapInfo)KCGIMAGEAlphaPremultipledLast); if(上下文==NULL){ CGCOLORSPACTERELEASE(色彩空间); 返回零; } CGContextTranslateCm(上下文,-targetPoint.x,-targetPoint.y); [targetOpaqueView.layer renderInContext:context]; CGContextRelease(上下文); CGCOLORSPACTERELEASE(色彩空间); UIColor*color=[UIColor colorWithRed:pixel[0]/255.0 绿色:像素[1]/255.0 蓝色:像素[2]/255.0 alpha:像素[3]/255.0]; 返回颜色; } @结束 斯威夫特:

扩展UIView{ func color(在点:CGPoint)->UIColor{ var targetOpaqueView:UIView=self //遍历视图层次以查找不透明的父对象 while!targetOpaqueView.isOpaque&&targetOpaqueView.superview!=nil{ targetOpaqueView=targetOpaqueView.superview! } //将我们的观点转换为目标观点 让targetPoint:CGPoint=转换(点,到:targetPaqueView) 让colorSpace=CGColorSpaceCreateDeviceRGB() 设bitmapInfo=CGBitmapInfo(rawValue:CGImageAlphaInfo.PremultipledLast.rawValue) 可变像素:[UInt8]=[0,0,0,0] guard let context=CGContext(数据:&pixel,宽度:1,高度:1,bitsPerComponent:8,bytesPerRow:4,空格:colorSpace,bitmapInfo:bitmapInfo.rawValue)else{ 归零 } context.translateBy(x:-targetPoint.x,y:-targetPoint.y) //渲染目标不透明视图以获得所有可能的透明度 targetPaqueView.layer.render(在:上下文中) 返回UIColor(红色:CGFloat(像素[0])/255.0,绿色:CGFloat(像素[1])/255.0,蓝色:CGFloat(像素[2])/255.0,alpha:CGFloat(像素[3])/255.0) } } 此函数应返回alpha组件设置为
1.0
的颜色。它必须是
1.0
,否则我们无法继续。为什么?假设
UIImageView
alpha被设置为50%->我们不会遍历视图层次结构(这个
targetOpaqueView
dance)->我们会得到一个alpha分量接近
0.5
->的颜色,下面是什么?白色黑色橙色的

问题#2-设备 每个设备都是不同的,可以显示不同的颜色范围-iPad,iPhone。。。这还包括其他设备类型,如计算机显示器、打印机等。。。因为我不知道你想在你的应用程序中实现什么,把它作为一个提醒——每个设备都有相同的颜色,但外观不同

问题#3-颜色配置文件 下面是显示P3配置文件和通用sRGB的比较。只需在macOS上启动ColorSync实用程序,就可以比较更多配置文件。它表明,将颜色从一个空间转换为另一个空间时,颜色会有所不同

问题