Color Picker

  • Hallo,

    ich habe versucht den Color Picker von v-vent.com/blog/?p=27 in meine App einzubinden.

    Ich möchte mit meiner bestehenden Klasse und *.xib arbeiten.

    In die *.xib habe ich eine neue View (colorPickerView) und ein ImageView (crossHairs) hinzugefügt.

    Die View ist hidden und soll sich erst sichtbar schalten, wenn ein Button gedrückt wird.

    Soweit, sogut. In meiner *.h habe ich:

    Quellcode

    1. /* ColorPicker */
    2. IBOutlet UIView *colorPickerView;
    3. IBOutlet UIImageView *crossHairs;
    4. CGRect colorMatrixFrame;
    5. CGFloat currentHue;
    6. CGFloat currentSaturation;
    7. UIColor *currentColor;
    8. /* ColorPicker */
    9. @property (readwrite) CGFloat currentHue;
    10. @property (readwrite) CGFloat currentSaturation;
    Alles anzeigen


    Außerdem habe ich die Constants.h aus dem Sample Code eingefügt und die Werte an meine Bedürfnisse angepasst:

    Quellcode

    1. #define kHueSatImage @"colormap.png"
    2. #define kHueSatFrame CGRectMake(11, 0, 298, 257)
    3. #define kHueEpsilon 0.005
    4. #define kSatEpsilon 0.005
    5. #define kAnimationDuration 0.6
    6. #define kMatrixWidth 298.0
    7. #define kMatrixHeight 257.0
    8. #define kXAxisOffset 11.0
    9. #define kYAxisOffset 0
    Alles anzeigen


    Den *.m Sample Code habe ich ebenfalls an meine Bedürfnisse angepasst, was dann so aussieht:

    Quellcode

    1. /* ColorPicker */
    2. #import "Constants.h"
    3. /* ColorPicker */
    4. @synthesize currentHue;
    5. @synthesize currentSaturation;
    6. - (id)initWithCoder:(NSCoder *)coder {
    7. if (self = [super initWithCoder:coder]) {
    8. [colorPickerView setMultipleTouchEnabled:YES];
    9. colorMatrixFrame = kHueSatFrame;
    10. UIImageView *hueSatImage = [[UIImageView alloc] initWithFrame:colorMatrixFrame];
    11. [hueSatImage setImage:[UIImage imageNamed:kHueSatImage]];
    12. [colorPickerView addSubview:hueSatImage];
    13. [colorPickerView sendSubviewToBack:hueSatImage];
    14. [hueSatImage release];
    15. currentColor = [[UIColor alloc] init];
    16. }
    17. return self;
    18. }
    19. - (NSString *)hexStringFromColor:(CGColorRef)theColor {
    20. const CGFloat *c = CGColorGetComponents(theColor);
    21. CGFloat r, g, b;
    22. r = c[0];
    23. g = c[1];
    24. b = c[2];
    25. // Fix range if needed
    26. if (r < 0.0f) r = 0.0f;
    27. if (g < 0.0f) g = 0.0f;
    28. if (b < 0.0f) b = 0.0f;
    29. if (r > 1.0f) r = 1.0f;
    30. if (g > 1.0f) g = 1.0f;
    31. if (b > 1.0f) b = 1.0f;
    32. // Convert to hex string between 0x00 and 0xFF
    33. return [NSString stringWithFormat:@"#%02X%02X%02X", (int)(r * 255), (int)(g * 255), (int)(b * 255)];
    34. }
    35. - (void)getStringForRGB:(CGColorRef)theColor {
    36. const CGFloat *c = CGColorGetComponents(theColor);
    37. CGFloat r, g, b;
    38. r = c[0];
    39. g = c[1];
    40. b = c[2];
    41. [red setValue:[[NSString stringWithFormat:@"%d", (int)(r * 255)] floatValue]];
    42. [green setValue:[[NSString stringWithFormat:@"%d", (int)(g * 255)] floatValue]];
    43. [blue setValue:[[NSString stringWithFormat:@"%d", (int)(b * 255)] floatValue]];
    44. }
    45. - (void)updateHueSatWithMovement:(CGPoint)position {
    46. currentHue = (position.x - kXAxisOffset) / kMatrixWidth;
    47. currentSaturation = 1.0 - (position.y - kYAxisOffset) / kMatrixHeight;
    48. [self getStringForRGB:currentColor.CGColor];
    49. }
    50. - (void)animateView:(UIImageView *)theView toPosition:(CGPoint)thePosition {
    51. [UIView beginAnimations:nil context:NULL];
    52. [UIView setAnimationDuration:kAnimationDuration];
    53. // Set the center to the final postion
    54. theView.center = thePosition;
    55. // Set the transform back to the identity, thus undoing the previous scaling effect.
    56. theView.transform = CGAffineTransformIdentity;
    57. [UIView commitAnimations];
    58. }
    59. - (void)dispatchTouchEvent:(CGPoint)position {
    60. if (CGRectContainsPoint(colorMatrixFrame,position)) {
    61. [self animateView:crossHairs toPosition:position];
    62. [self updateHueSatWithMovement:position];
    63. }
    64. }
    65. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    66. for (UITouch *touch in touches) {
    67. [self dispatchTouchEvent:[touch locationInView:colorPickerView]];
    68. }
    69. }
    70. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    71. for (UITouch *touch in touches){
    72. [self dispatchTouchEvent:[touch locationInView:colorPickerView]];
    73. }
    74. }
    Alles anzeigen


    Ich setze dann bei dem Button Event einfach :

    Quellcode

    1. [colorPickerView setHidden:NO];


    Eigentlich sollte das dann ungefähr so aussehen:
    osxentwicklerforum.de/index.php/Attachment/2399/

    Bei mir wird eine schwarze View nur mit dem Fadenkreuz angezeigt (so wie in Interface Builder erstellt).

    Sobald man das Fadenkreuz berührt stürzt die App ab:
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -CGColor not defined for the UIColor <UIPlaceholderColor: 0x4d280b0>; need to first convert colorspace.'


    Dabei habe ich ja nur den Sample Code (der einwandfrei funktioniert) kopiert und leicht angepasst.

    Vielleicht mag sich das ja mal einer anschauen, wär nett.

    Gruß
  • AR.DDev schrieb:

    Ich habe es so aus der Sample App übernommen. Da funktioniert es einwandfrei.

    Weil die Sample App das macht, was Deine Fehlermeldung anmeckert. Wenn Du schon per Copy-Paste Programmierst, dann aber richtig. ;)

    AR.DDev schrieb:

    edit: und selbst wenn ich die Zeile auskommentiere

    Die lässt Du besser auskommentiert, weil die verursacht in der Sample-App nur ein Speicherleck.

    Michael
  • AR.DDev schrieb:

    need to first convert colorspace


    Ich denke man will dir nahelegen, wie man auf Fehlermeldungen reagiert.
    Der erste Schritt sollte nicht ein Forumspost sein. ;)

    Ohne deinen Code genauer angeschaut zu haben, würde ich mir jetzt die NSColor und NSColorspace Doku mal hernehmen.
    Ausserdem Google mit der Fehlermeldung in Anführungszeichen, damit man nur exakte Treffer hat.

    Auf Anhieb finde ich da einige vielversprechende Themen dazu unter den ersten Treffern.

    Hier: cocoabuilder.com/archive/cocoa…-an-nsfont-attribute.html
    Findet sich z.B. der Hinweis, dass colorComponents eine Exception raisen wenn die Farbe im falschen Colorspace ist.
    Ebenso ein Codebeispiel wie man das konvertiert.

    Wenn ich bedenke, dass meine Google Suche nicht mal 1/10 der Zeit in Anspruch genommen hat, die ich für dieses Posting benötige,
    stellt sich die Frage wieviel Zeit du sparen könntest wenn du nicht tagelang auf Antworten hier im Thread wartest. ;)


    Klingt jetzt hart, soll aber nur ein Ratschlag sein.
    Die Apple-Doku ist hervorragend, und im Netz finden sich zu nahezu jedem erdenklichen Thema schon massig Themen mit Lösungsansätzen.
    Anderen Leuten ist ihre Zeit eben auch kostbar, so dass sie eben eine gewisse Eigeninitiative vom Fragenden erwarten.
    Außerdem ist man fast immer schneller wenn man selbst die Lösung sucht.

    Bei echten Problemen finden sich hier auch immer genug Leute die hilfsbereit zur Seite stehen.
  • Tobse001 schrieb:

    AR.DDev schrieb:

    need to first convert colorspace


    Ich denke man will dir nahelegen, wie man auf Fehlermeldungen reagiert.
    Der erste Schritt sollte nicht ein Forumspost sein. ;)

    Ohne deinen Code genauer angeschaut zu haben, würde ich mir jetzt die NSColor und NSColorspace Doku mal hernehmen.
    Ausserdem Google mit der Fehlermeldung in Anführungszeichen, damit man nur exakte Treffer hat.

    Wir spielen hier zwar mit UIColor herum, aber egal.


    Auf Anhieb finde ich da einige vielversprechende Themen dazu unter den ersten Treffern.

    Hier: cocoabuilder.com/archive/cocoa…-an-nsfont-attribute.html
    Findet sich z.B. der Hinweis, dass colorComponents eine Exception raisen wenn die Farbe im falschen Colorspace ist.
    Ebenso ein Codebeispiel wie man das konvertiert.

    Wenn ich bedenke, dass meine Google Suche nicht mal 1/10 der Zeit in Anspruch genommen hat, die ich für dieses Posting benötige,
    stellt sich die Frage wieviel Zeit du sparen könntest wenn du nicht tagelang auf Antworten hier im Thread wartest. ;)


    Klingt jetzt hart, soll aber nur ein Ratschlag sein.
    Die Apple-Doku ist hervorragend, und im Netz finden sich zu nahezu jedem erdenklichen Thema schon massig Themen mit Lösungsansätzen.
    Anderen Leuten ist ihre Zeit eben auch kostbar, so dass sie eben eine gewisse Eigeninitiative vom Fragenden erwarten.
    Außerdem ist man fast immer schneller wenn man selbst die Lösung sucht.


    Ehrlich gesagt, ich glaube, dass meine erste Bemerkung das Problem hätte lösen können. Er hat eine Farbe ohne CGColorRef erzeugt, wo soll da ein Farbraum herkommen.
    Als wenn ich in Italien "coperta" bestelle und mich wundere, warum ich nichts zu essen habe.
    Erst danach kommt die Frage: Welcher?
    Und auch die Speicherlecks. Aber sowieso: Ohne Schirm kann man sich im Forum gar nicht mehr bewegen, so tropft es überall.


    Bei echten Problemen finden sich hier auch immer genug Leute die hilfsbereit zur Seite stehen.
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    Ehrlich gesagt, ich glaube, dass meine erste Bemerkung das Problem hätte lösen können. Er hat eine Farbe ohne CGColorRef erzeugt, wo soll da ein Farbraum herkommen.
    Als wenn ich in Italien "coperta" bestelle und mich wundere, warum ich nichts zu essen habe.
    Erst danach kommt die Frage: Welcher?
    Und auch die Speicherlecks. Aber sowieso: Ohne Schirm kann man sich im Forum gar nicht mehr bewegen, so tropft es überall.
    Bei echten Problemen finden sich hier auch immer genug Leute die hilfsbereit zur Seite stehen.

    Genau das ist hier seit den letzten 3 Jahren das Problem. Seit dem iPhone SDK sollen das Denken immer andere übernehmen.
    Toller Beitrag. :thumbup:
  • Ich habe den Color Picker nun so umgeschrieben, dass man ihn einfach in seine eigenen Anwendungen integrieren kann.
    Den Slider für die Helligkeit habe ich dabei entfernt, da ich ihn nicht benötige.
    Wer daran interessiert ist, hier kommen die Source Files (zwei Teile, da sonst zu groß).
    Einfach die beiden Teile laden, extrahieren und dann alle Dateien zusammen in einen Ordner kopieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AR.DDev ()