我试图实现一个由UIImageView
中的图像组成的简单颜色选择器。当用户在其上拖动手指时,我希望相邻视图使用当前像素颜色不断更新。
我在@ rdelmar对this question on SO的回答中找到了接近理想解决方案的内容,所以我借用了代码并修改了它以将pickedColor
发送回方法AddCategoryViewController
。但是,此方法(setColorview
)未更新colorView
。
我的断点和NSLog显示正在从触摸,发送和接收中收集颜色信息,但显然未应用,如受影响的UIView colorView
不反映颜色的事实所示。最明显的问题是属性colorView
读取null
,我不明白为什么。
作为奖励,我真的希望选择器能够响应滑动的手指,而不仅仅是轻拍。
我已在下面列出了所有相关代码,重要行标有// *******************
感谢您的期待!所有帮助表示赞赏!
代码从此处开始,文件由---------------------------:
分隔//
// UIView+UIView_ColorOfPoint.m
// WMDGx
//
//
#import "UIView+UIView_ColorOfPoint.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIView (UIView_ColorOfPoint)
-(UIColor *) colorOfPoint:(CGPoint)point
{
unsigned char pixel[4] = {0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixel,
1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(context, -point.x, -point.y);
[self.layer renderInContext:context];
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
UIColor *color = [UIColor colorWithRed:pixel[0]/255.0
green:pixel[1]/255.0 blue:pixel[2]/255.0
alpha:pixel[3]/255.0];
return color;
}
@end
-----------------------------------------
//
// ColorPickerView.m
// WMDGx
//
//
#import "ColorPickerView.h"
AddCategoryViewController *addCatVC;
@implementation ColorPickerView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint loc = [touch locationInView:self];
self.pickedColor = [self colorOfPoint:loc];
NSLog(@"Touches began");
//******************** For sending color info to setColorView in AddCategoryViewController
addCatVC = [[AddCategoryViewController alloc]init];
addCatVC.colorForColorView = self.pickedColor;
NSLog(@"Picked color is %@",self.pickedColor);
//******************** Call the method in AddCategoryViewController, which should display the color of the current pixel
[addCatVC setColorview];
}
@end
--------------------------------
//
// AddCategoryViewController.m
// WMDGx
//
//
#import "AddCategoryViewController.h"
@interface AddCategoryViewController ()
@end
@implementation AddCategoryViewController
NSMutableArray *array;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.catTextField.delegate = self;
[self.pickerImageView setUserInteractionEnabled:YES];
self.colorView.layer.cornerRadius = 6;
// ********************I put this NSLog here to check the status of the property self.colorView
NSLog(@"Color view is %@",self.colorView);//_colorView UIView * 0x8a63d30 0x08a63d30 (from Variables View)
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[self.catTextField resignFirstResponder];
return YES;
}
-(void)setColorview // ********************This is where the backgroundColor of self.colorView should be set
{
NSLog(@"colorForColorView is %@",self.colorForColorView);
NSLog(@"Color view is %@",self.colorView); //_colorView UIView * nil 0x00000000 (from Variables View)
[self.colorView setBackgroundColor:self.colorForColorView]; //colorView should display the color, but doesn't
NSLog(@"Color view is %@",self.colorView); //_colorView UIView * nil 0x00000000 (from Variables View)
NSLog(@"Color view color is %@",self.colorView.backgroundColor);
}
- (IBAction)saveButton:(UIBarButtonItem *)sender
{
if (self.catTextField.text.length < 1)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No category created"
message:@"Please create a new category"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
else if (!self.colorView.backgroundColor)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No color selected"
message:@"Please select a color for your new category"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
}
else
{
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
self.thisCategory = [WMDGCategory MR_createInContext:localContext];
self.thisCategory.name = [self.catTextField.text uppercaseString];
self.thisCategory.color = self.colorView.backgroundColor;
[localContext MR_saveToPersistentStoreAndWait];
[self.thisCell setUserInteractionEnabled:NO];
[self.delegate addCatControllerDidSave];
}
}
- (IBAction)cancelButton:(UIBarButtonItem *)sender
{
[self.delegate addCatControllerDidCancel:self.thisCategory];
}
@end
答案 0 :(得分:1)
这是我用于此目的的代码。除了触摸开始,我有相同的移动触摸代码,并允许您也想要的滑动效果。我的相邻视图的标记为200,我根据所选颜色查找和设置。看起来您的链接代码比我的更干净,但也许看到这将是有用的。
首先,当我接触到时:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet *allTouches = [event allTouches];
if ([allTouches count] != 1)
return;
UIView *picker = [self.view viewWithTag:100];
UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
CGPoint p = [touch locationInView:self.view];
if (CGRectContainsPoint(picker.frame, p))
{
printf("Hit gradient!\n");
p = [touch locationInView:picker];
UIColor *c = [self getPixelColor:[UIImage imageNamed:@"gradient.png"]
xLoc:p.x
yLoc:p.y];
UIView *display = [self.view viewWithTag:200]; // representative color
[display setBackgroundColor:c];
}
}
获取颜色的代码(我相信此代码是根据其他代码改编而来的):
- (UIColor*)getPixelColor:(UIImage *)image xLoc:(int)x yLoc:(int)y
{
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
const UInt8* data = CFDataGetBytePtr(pixelData);
if (x < 0 || x >= image.size.width || y < 0 || y >= image.size.height)
{
CFRelease(pixelData);
return [UIColor whiteColor];
}
int pixelInfo = ((image.size.width * y) + x ) * 4;
UInt8 red = data[pixelInfo];
UInt8 green = data[(pixelInfo + 1)];
UInt8 blue = data[pixelInfo + 2];
UInt8 alpha = data[pixelInfo + 3];
CFRelease(pixelData);
UIColor* color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];
return color;
}