Цветовой Оттенок Изображения UIButton
Я заметил, что когда я ставлю белый или черный UIImage на UISegmentedControl он автоматически маскирует цвет, чтобы соответствовать оттенку сегментированного элемента управления. Я думал, что это действительно круто, и задавался вопросом, Могу ли я сделать это в другом месте. Например, у меня есть куча кнопок, которые имеют одинаковую форму, но разные цвета. Вместо того, чтобы делать PNG для каждой кнопки, я мог бы как-то использовать эту цветовую маскировку, чтобы использовать одно и то же изображение для всех из них, но затем установить оттенок цвета или что-то изменить их настоящий цвет?
15 ответов:
начиная с iOS 7, есть новый метод
UIImageдля указания режима рендеринга. Использование режима рендерингаUIImageRenderingModeAlwaysTemplateпозволит цвету изображения управляться цветом оттенка кнопки.С
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *image = [[UIImage imageNamed:@"image_name"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [button setImage:image forState:UIControlStateNormal]; button.tintColor = [UIColor redColor];Свифт
let button = UIButton(type: .custom) let image = UIImage(named: "image_name")?.withRenderingMode(.alwaysTemplate) button.setImage(image, for: .normal) button.tintColor = UIColor.red
как Рик уже упоминал в своем post вы можете установить режим рендеринга в коде, вы также можете сделать это непосредственно в каталоге изображений, см. прикрепленное изображение ниже. Просто установите
Render AsдоTemplate Image
будьте осторожны у меня были проблемы с iOS 7 и такой подход. Поэтому, если вы также используете iOS 7, Вы можете сделать это в коде, чтобы быть уверенным, как описано здесь.
вы должны установить режим рендеринга изображения в
UIImageRenderingModeAlwaysTemplateдля того чтобыtintColorвлияет на UIImage. Вот решение в Swift:let image = UIImage(named: "image-name") let button = UIButton() button.setImage(image?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), forState: .Normal) button.tintColor = UIColor.whiteColor()
Если у вас есть пользовательская кнопка с фоновым изображением.Вы можете установить оттенок цвета вашей кнопки и переопределить изображение следующим образом .
в активах выберите фон который вы хотите установить оттенок цвета.
в инспекторе атрибутов изображения установите значение render как "Template Image"
теперь всякий раз, когда вы устанавливаете
button.tintColor = UIColor.redвы кнопка будет отображаться красным цветом.
в Swift вы можете сделать это так:
var exampleImage = UIImage(named: "ExampleImage.png")?.imageWithRenderingMode(.AlwaysTemplate)тогда в вашем viewDidLoad
exampleButtonOutlet.setImage(exampleImage, forState: UIControlState.Normal)и изменить цвет
exampleButtonOutlet.tintColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1) //your colorредактировать Xcode 8 Теперь вы можете также просто режим рендеринга изображения в вашем .xcassets для шаблона изображения, а затем вам не нужно специально объявлять его в
var exampleImageбольше
не уверен точно, что вы хотите, но этот метод категории будет маскировать UIImage с указанным цветом, так что вы можете иметь одно изображение и изменить его цвет на все, что вы хотите.
ImageUtils.h
- (UIImage *) maskWithColor:(UIColor *)color;ImageUtils.м
-(UIImage *) maskWithColor:(UIColor *)color { CGImageRef maskImage = self.CGImage; CGFloat width = self.size.width; CGFloat height = self.size.height; CGRect bounds = CGRectMake(0,0,width,height); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); CGContextClipToMask(bitmapContext, bounds, maskImage); CGContextSetFillColorWithColor(bitmapContext, color.CGColor); CGContextFillRect(bitmapContext, bounds); CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext); UIImage *coloredImage = [UIImage imageWithCGImage:cImage]; CGContextRelease(bitmapContext); CGColorSpaceRelease(colorSpace); CGImageRelease(cImage); return coloredImage; }импортируйте категорию ImageUtils и сделайте что-то вроде этого...
#import "ImageUtils.h" ... UIImage *icon = [UIImage imageNamed:ICON_IMAGE]; UIImage *redIcon = [icon maskWithColor:UIColor.redColor]; UIImage *blueIcon = [icon maskWithColor:UIColor.blueColor];
Swift 4 с customType:
let button = UIButton(frame: aRectHere) let buttonImage = UIImage(named: "imageName") button.setImage(buttonImage?.withRenderingMode(.alwaysTemplate), for: .normal) button.tintColor = .white
Для Xamarin.iOS (C#):
UIButton messagesButton = new UIButton(UIButtonType.Custom); UIImage icon = UIImage.FromBundle("Images/icon.png"); messagesButton.SetImage(icon.ImageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate), UIControlState.Normal); messagesButton.TintColor = UIColor.White; messagesButton.Frame = new RectangleF(0, 0, 25, 25);
Swift 3:
это решение может быть удобно, если вы уже настроили свое изображение через Xcode interface builder. В основном у вас есть одно расширение для раскрашивания изображения:
extension UIImage { public func image(withTintColor color: UIColor) -> UIImage{ UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale) let context: CGContext = UIGraphicsGetCurrentContext()! context.translateBy(x: 0, y: self.size.height) context.scaleBy(x: 1.0, y: -1.0) context.setBlendMode(CGBlendMode.normal) let rect: CGRect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) context.clip(to: rect, mask: self.cgImage!) color.setFill() context.fill(rect) let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage } }тогда, вы можете подготовить это UIButton расширение для раскрашивания изображения для определенного состояния:
extension UIButton { func imageWith(color:UIColor, for: UIControlState) { if let imageForState = self.image(for: state) { self.image(for: .normal)?.withRenderingMode(.alwaysTemplate) let colorizedImage = imageForState.image(withTintColor: color) self.setImage(colorizedImage, for: state) } } }использование:
myButton.imageWith(.red, for: .normal)С. П. (работает также в ячейках таблицы, вам не нужно называть
setNeedDisplay()метод, изменение цвета происходит немедленно из-за UIImage
Если вы хотите вручную замаскировать свое изображение, вот обновленный код, который работает с экранами retina
- (UIImage *)maskWithColor:(UIColor *)color { CGImageRef maskImage = self.CGImage; CGFloat width = self.size.width * self.scale; CGFloat height = self.size.height * self.scale; CGRect bounds = CGRectMake(0,0,width,height); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef bitmapContext = CGBitmapContextCreate(NULL, width, height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); CGContextClipToMask(bitmapContext, bounds, maskImage); CGContextSetFillColorWithColor(bitmapContext, color.CGColor); CGContextFillRect(bitmapContext, bounds); CGImageRef cImage = CGBitmapContextCreateImage(bitmapContext); UIImage *coloredImage = [UIImage imageWithCGImage:cImage scale:self.scale orientation:self.imageOrientation]; CGContextRelease(bitmapContext); CGColorSpaceRelease(colorSpace); CGImageRelease(cImage); return coloredImage; }
Вы Должны Попробовать
После Установки Рамки
NSArray *arr10 =[NSArray arrayWithObjects:btn1,btn2,nil]; for(UIButton *btn10 in arr10) { CAGradientLayer *btnGradient2 = [CAGradientLayer layer]; btnGradient2.frame = btn10.bounds; btnGradient2.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:151.0/255.0f green:206.0/255.5 blue:99.0/255.0 alpha:1] CGColor], (id)[[UIColor colorWithRed:126.0/255.0f green:192.0/255.5 blue:65.0/255.0 alpha:1]CGColor], nil]; [btn10.layer insertSublayer:btnGradient2 atIndex:0]; }
Swift 3.0
let image = UIImage(named:"NoConnection")! warningButton = UIButton(type: .system) warningButton.setImage(image, for: .normal) warningButton.tintColor = UIColor.lightText warningButton.frame = CGRect(origin: CGPoint(x:-100,y:0), size: CGSize(width: 59, height: 56)) self.addSubview(warningButton)
изменить изображение кнопки или вид изображения оттенок цвета Swift:
btn.графическое представление?.изображение = БТН.графическое представление?.изображение?.withRenderingMode(.alwaysTemplate)
btn.графическое представление?.tintColor = #colorLiteral(красный: 0 зеленый: 0 синий: 0, альфа: 1)
ни один из выше работал для меня, потому что оттенок был снят после клика. Я должен был использовать
button.setImageTintColor(Palette.darkGray(), for: UIControlState())



Comments