颜色选择器窘迫

时间:2014-06-12 05:15:11

标签: ios objective-c color-picker

我试图实现一个由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

1 个答案:

答案 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;
}