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不匹配!”);
}
}
如果您不熟悉以下主题,请不要这样做。我将向你们展示一种方法,一种非常简单的方法,但会有一些陷阱
资源
需要提前阅读或至少了解/熟悉的内容
- 颜色相关
- (特别是)
- 浮动相关
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实用程序,就可以比较更多配置文件。它表明,将颜色从一个空间转换为另一个空间时,颜色会有所不同
问题