【发布时间】:2014-06-12 05:15:11
【问题描述】:
我正在尝试实现一个简单的颜色选择器,该颜色选择器由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
【问题讨论】:
标签: ios objective-c color-picker