Как изменить tintColor для кнопки изображения в Swift? [Дубликат]

$result = ['5' => 'cherry', '7' => 'apple'];
array_multisort($result, SORT_ASC);
print_r($result);

Массив ([0] => яблоко [1] => вишня)

//...
array_multisort($result, SORT_DESC);
//...

Массив ([0] => вишня [1] => яблоко)

223
задан Adrian 1 August 2015 в 20:46
поделиться

15 ответов

Начиная с iOS 7, в UIImage существует новый метод для указания режима рендеринга. Использование режима рендеринга UIImageRenderingModeAlwaysTemplate позволит цвету изображения управлять цветом оттенка кнопки.

Objective-C

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *image = [[UIImage imageNamed:@"image_name"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
[button setImage:image forState:UIControlStateNormal]; 
button.tintColor = [UIColor redColor];

Swift

let button = UIButton(type: .custom)
let image = UIImage(named: "image_name")?.withRenderingMode(.alwaysTemplate)
button.setImage(image, for: .normal)
button.tintColor = UIColor.red
477
ответ дан Ric Santos 22 August 2018 в 20:40
поделиться
  • 1
    Я думаю, что лучше использовать button.imageView.tintColor – M.Othman 11 March 2015 в 14:02
  • 2
    @ M.Othman работает только для меня, когда я использую button.tintColor, а не button.imageview.tintColor – pnizzle 1 July 2015 в 00:28
  • 3
    Просто не забудьте установить режим рендеринга изображения на изображении в xcassets на @hashier – Dean 29 July 2015 в 21:03
  • 4
    Создание UIButton типа UIButtonTypeSystem автоматически оценит установленный вами tintColor. – carloshwa 3 November 2015 в 08:14
  • 5
    Если ваш tintColor слишком темный, убедитесь, что adjustsImageWhenHighlighted НЕТ. (Или в IB: «Выделенные настройки изображения» не отмечены.) – Jason Moore 26 November 2015 в 20:47

Swift 4 с customType:

let button = UIButton(frame: aRectHere)
    let buttonImage = UIImage(named: "imageName")
    button.setImage(buttonImage?.withRenderingMode(.alwaysTemplate), for: .normal)
    button.tintColor = .white
6
ответ дан aBikis 22 August 2018 в 20:40
поделиться

Swift 3:

Это решение может быть удобным, если вы уже настроили свой образ через построитель интерфейса xCode. В основном у вас есть одно расширение для раскраски изображения:

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)

PS (хорошо работает и в ячейках таблицы, вам не нужно вызывать метод setNeedDisplay(), изменение цвета происходит немедленно из-за расширения UIImage ..

4
ответ дан Alessandro Ornano 22 August 2018 в 20:40
поделиться

Пользовательские кнопки отображаются в соответствующих цветах изображений. Установка типа кнопки в «Систему» ​​в раскадровке (или UIButtonTypeSystem в коде) отобразит изображение кнопки с цветом оттенков по умолчанию.

(проверено на iOS9, Xcode 7.3)

58
ответ дан auco 22 August 2018 в 20:40
поделиться
  • 1
    Который можно избежать с помощью методов alwaysTemplate и tintColor, предложенных здесь. С преимуществом кнопки .system вы получаете изменение цвета с прикосновением к крану. – Chris Prince 8 February 2018 в 20:58

Как уже упоминал Рик в своем сообщении , вы можете установить режим рендеринга в коде, вы также можете сделать это непосредственно в каталоге изображений, см. прикрепленный образ ниже. Просто установите для параметра Render As значение Template Image

enter image description here [/g2]

Предостережение. У меня были проблемы с iOS 7 и этим подходом. Поэтому, если вы используете iOS 7, вы также можете сделать это в коде, чтобы убедиться, что описано здесь здесь .

194
ответ дан Community 22 August 2018 в 20:40
поделиться
  • 1
    В качестве побочной заметки файл изображения должен быть черным и прозрачным (не b & amp; w) – Axel Guilmin 25 February 2016 в 17:02
  • 2
    @AxelGuilmin не очень. Ваше изображение может быть любого цвета, который вы хотите, и прозрачного. Любой цвет, отличный от прозрачного , будет преобразован в общий , а затем по умолчанию будет окрашен в черный цвет. – Alejandro Iván 31 March 2016 в 16:51

В 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

EDIT Xcode 8 Теперь вы можете также просто режим рендеринга изображения в ваших .xcassets для Template Image, а затем вам не нужно специально объявлять его в var exampleImage больше

17
ответ дан Fri3ndlyGerman 22 August 2018 в 20:40
поделиться

Вы должны попробовать

После установки рамки

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];

}
2
ответ дан guptha 22 August 2018 в 20:40
поделиться

Если у вас есть пользовательская кнопка с фоновым изображением. Вы можете установить цвет оттенка вашей кнопки и переопределить изображение следующим образом.

В активах выберите фон кнопки, который вы хотите установить цвет оттенка.

В инспекторе атрибутов изображения установите значение render как «Template Image»

Теперь, когда вы устанавливаете button.tintColor = UIColor.red кнопка будет отображаться красным цветом.

19
ответ дан Ilker Baltaci 22 August 2018 в 20:40
поделиться
  • 1
    если вы здесь, вы можете перейти по этой ссылке: useyourloaf.com/blog/styling-buttons-using-the-asset-catalog и перейти к изображениям шаблонов (чтобы послужить объяснением) – cspam 22 May 2017 в 14:29
  • 2
    Это лучшее решение, поскольку оно уменьшает код и в значительной степени делает то же самое, что и принятый ответ. – DS. 29 April 2018 в 23:29

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)
1
ответ дан Jad 22 August 2018 в 20:40
поделиться

Если вы хотите вручную замаскировать свое изображение, здесь обновляется код, который работает со сетками сетчатки

- (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;
}
3
ответ дан Josh Bernfeld 22 August 2018 в 20:40
поделиться

Не уверен, что именно вы хотите, но метод этой категории будет маскировать UIImage с указанным цветом, чтобы вы могли иметь одно изображение и изменять его цвет по своему желанию.

ImageUtils.h

- (UIImage *) maskWithColor:(UIColor *)color;

ImageUtils.m

-(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];
14
ответ дан Kirby Todd 22 August 2018 в 20:40
поделиться
  • 1
    Используйте kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast на CGBitmapContextCreate – Luis Ascorbe 4 February 2014 в 10:26
  • 2
    Приятно, но нужно настроить для графики Retina ... Когда я запускаю это изображение Retina, он возвращает мне не сетчатку. – jowie 26 March 2014 в 16:08
  • 3
    Для поддержки устройств Retina вы можете использовать свойство scale класса UIDevice: CGFloat scale = [UIScreen mainScreen].scale; CGFloat width = self.size.width * scale; CGFloat height = self.size.height * scale; Свойство scale существует как iOS 4.0. – Philipp Frischmuth 8 January 2015 в 13:29
  • 4
    Вам также необходимо использовать значение scale, когда создан UIImage: UIImage *coloredImage = [UIImage imageWithCGImage:cImage scale:scale orientation:self.imageOrientation]; – Philipp Frischmuth 8 January 2015 в 13:42

Для 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);
4
ответ дан Maciek z Wrocławia 22 August 2018 в 20:40
поделиться

Вы должны установить режим рендеринга изображения на 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()
33
ответ дан Nick Wargnier 22 August 2018 в 20:40
поделиться

Изменить цвет изображения кнопки или цвет оттенка изображения Swift:

btn.imageView? .image = btn.imageView? .image? .withRenderingMode (.alwaysTemplate)

btn.imageView ? .tintColor = #colorLiteral (красный: 0, зеленый: 0, синий: 0, альфа: 1)

1
ответ дан Urvish Modi 22 August 2018 в 20:40
поделиться
  • 1
    не могли бы вы отформатировать этот код? – WhatsThePoint 13 July 2017 в 14:11
0
ответ дан Szymon Klimaszewski 5 November 2018 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: