<select id="countries" onfocus="this.defaultIndex=this.selectedIndex;" onchange="this.selectedIndex=this.defaultIndex;">
<option value="1">Country1</option>
<option value="2">Country2</option>
<option value="3">Country3</option>
<option value="4">Country4</option>
<option value="5">Country5</option>
<option value="6">Country6</option>
<option value="7" selected="selected">Country7</option>
<option value="8">Country8</option>
<option value="9">Country9</option>
</select>
Протестированный и рабочий в IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 для Windows и Google Chrome.
Сначала вам нужно создать подкласс UIImageView и переопределить метод drawRect. Вашему классу требуется свойство UIColor (назовем его overlayColor) для хранения смешанного цвета и настраиваемый установщик, который вызывает перерисовку при изменении цвета. Примерно так:
- (void) setOverlayColor:(UIColor *)newColor {
if (overlayColor)
[overlayColor release];
overlayColor = [newColor retain];
[self setNeedsDisplay]; // fires off drawRect each time color changes
}
В методе drawRect вам нужно сначала нарисовать изображение, а затем наложить на него прямоугольник, заполненный желаемым цветом, а также соответствующий режим наложения, примерно так:
- (void) drawRect:(CGRect)area
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// Draw picture first
//
CGContextDrawImage(context, self.frame, self.image.CGImage);
// Blend mode could be any of CGBlendMode values. Now draw filled rectangle
// over top of image.
//
CGContextSetBlendMode (context, kCGBlendModeMultiply);
CGContextSetFillColor(context, CGColorGetComponents(self.overlayColor.CGColor));
CGContextFillRect (context, self.bounds);
CGContextRestoreGState(context);
}
Обычно для оптимизации рисование, вы ограничили бы фактический рисунок только областью, переданной в drawRect, но поскольку фоновое изображение должно перерисовываться каждый раз при изменении цвета, вероятно, все это потребует обновления.
Также вы можете рассмотреть возможность кэширования составного изображения для повышения производительности и просто визуализации его в drawRect :, а затем обновить его, если грязный флаг действительно грязный. Хотя вы можете часто менять его, могут быть случаи, когда появляются отрисовки, и вы не испачкаетесь, поэтому вы можете просто обновить его из кеша. Если память важнее производительности, вы можете игнорировать это :)
Единственное, что я могу придумать, - это создать прямоугольный, в основном прозрачный вид с желаемым цветом и наложить его на вид изображения, добавив его в качестве подвида. Я не уверен, действительно ли это окрасит изображение так, как вы себе представляете, хотя я не уверен, как бы вы взломали изображение и выборочно заменили одни цвета другими ... звучит для меня довольно амбициозно.
Например:
UIImageView *yourPicture = (however you grab the image);
UIView *colorBlock = [[UIView alloc] initWithFrame:yourPicture.frame];
//Replace R G B and A with values from 0 - 1 based on your color and transparency
colorBlock.backgroundColor = [UIColor colorWithRed:R green:G blue:B alpha:A];
[yourPicture addSubView:colorBlock];
Документация для UIColor:
colorWithRed:green:blue:alpha:
Creates and returns a color object using the specified opacity and RGB component values.
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
Parameters
red - The red component of the color object, specified as a value from 0.0 to 1.0.
green - The green component of the color object, specified as a value from 0.0 to 1.0.
blue - The blue component of the color object, specified as a value from 0.0 to 1.0.
alpha - The opacity value of the color object, specified as a value from 0.0 to 1.0.
Return Value
The color object. The color information represented by this object is in the device RGB colorspace.
This could be very useful: PhotoshopFramework is one powerful library to manipulate images on Objective-C. This was developed to bring the same functionalities that Adobe Photoshop users are familiar. Examples: Set colors using RGB 0-255, apply blend filers, transformations...
Is open source, here is the project link: https://sourceforge.net/projects/photoshopframew/
Просто краткое пояснение (после некоторых исследований по этой теме). В документе Apple здесь четко указано, что:
Класс
UIImageView
оптимизирован для вывода изображений на дисплей.UIImageView
не вызывает методdrawRect:
своих подклассов. Если ваш подкласс должен включать пользовательский код рисования, вы должны вместо этого создать подкласс классаUIView
.
, так что даже не тратьте время на попытки переопределить этот метод в подклассе UIImageView
. Вместо этого начните с UIView
.