Блог :. Делаем невероятное: cоздаем UIColor от RGB-строки!!!

Делаем невероятное: cоздаем UIColor от RGB-строки!!!

28 Июн, 2014

Вот прямо руки чешутся написать про это, а точнее высказать свое негодование.

Представьте, что вам вдруг во время программирования яблокодевайса понадобилось указать какой-либо цвет (ну там подхайлайтить что-то), то вы, определившись с цветом с помощью пипетки или на глаз (ну там ВЫРВИГЛАЗНОЖЕЛТЫЙ) пытаетесь создать объект класса UIColor. И тут начинается ступор. Я конечно понимаю, что компания Apple еще те извращенцы пытается быть не как все, но чтобы извратиться и придумать конструктор от объекта UIColor в виде покомпонентно разложенных каналов, причем не от нуля до 0xff (да-да, я чуть не охренел от эротической фантазии того, кто это придумал), — а от дробного числа в  интервале [0..1]!!!!

Блин, ну ребята, задавать цвет в rgb hex формате - это стандарт, который используется ну просто везде, начиная с самых древнейших версий HTML, CSS, Qt и так далее. Даже в андроиде не поленились написать метод Color.parseColor. Максимум, где я встретил такую нотацию - это при создании цвета в OpenGL. Т.е. примерно у каждого ui-разработчика есть представление в голове, что вот, противно- приятно-голубой цвет, который используется просто повсюду - это #0099cc, оранжевый - это наоборот надо поменять местами каналы, и так далее. И тут у тебя начинается разрыв мозга, как привычный цвет в голове быстренько перевести в систему счисления от нуля до единицы?)) не, ну я конечно заметил, что разработчики ПРОВЕЛИ ИССЛЕДОВАНИЯ и заметили, что 50 оттенков серого настолько популярны, что они сделали специальный конструктор для этого - colorWithWhite:alpha:

В общем все грустно, я не пытаюсь сейчас показать какое-то изящество в написании говнокода, но я так понял, что этот метод должен присутствовать в каждом проекте:


UIColor* ColorFromStr(NSString *colorStr)
{
	unsigned int color = 0;
	float r, g, b, a = 1.0;
	NSScanner *scanner = [NSScanner scannerWithString:colorStr];
	[scanner setScanLocation:1];
	[scanner scanHexInt:&color];
	
	if ([colorStr length] == 9) {
		a = (color & 0xff) / 255.0;
		color >>= 8;
	}
	r = ((color & 0xff0000) >> 16) / 255.0;
	g = ((color & 0xff00) >> 8) / 255.0;
	b = (color & 0xff) / 255.0;
	return [UIColor colorWithRed:r green:g blue:b alpha:a];
} 

UPD: Либо можно тоже самое изобразить на Swift:

extension UIColor {
    convenience init(htmlColor: String) {
        var color:UInt32 = 0;
        var r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat = 1.0;
        let scanner:NSScanner = NSScanner(string: htmlColor);

        scanner.scanLocation = 1;
        scanner.scanHexInt(&color)
        
        if (htmlColor.characters.count == 9) {
            a = CGFloat(color & 0xff) / 255.0;
            color >>= 8;
        }
        r = CGFloat((color & 0xff0000) >> 16) / 255.0;
        g = CGFloat((color & 0xff00) >> 8) / 255.0;
        b = CGFloat(color & 0xff) / 255.0;
        self.init(red:r, green:g, blue:b, alpha:a);
    }
}