그것은 수정할 수 UIImage
의를 renderingMode
스토리 보드 또는 XIB 편집기에서?
목표는 tintColor
특정 UIImageView
개체 에 적용 하는 것 입니다.
그것은 수정할 수 UIImage
의를 renderingMode
스토리 보드 또는 XIB 편집기에서?
목표는 tintColor
특정 UIImageView
개체 에 적용 하는 것 입니다.
답변:
.xib 또는 스토리 보드 파일에서 수행하는 방법은 다음과 같습니다.
(Obj-C) 카테고리 만들기 UIImageView
:
@interface UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode;
@end
@implementation UIImageView (Utils)
- (void)setImageRenderingMode:(UIImageRenderingMode)renderMode
{
NSAssert(self.image, @"Image must be set before setting rendering mode");
self.image = [self.image imageWithRenderingMode:renderMode];
}
@end
(Swift 4) 다음에 대한 확장 만들기 UIImageView
:
extension UIImageView {
func setImageRenderingMode(_ renderMode: UIImage.RenderingMode) {
assert(image != nil, "Image must be set before setting rendering mode")
// AlwaysOriginal as an example
image = image?.withRenderingMode(.alwaysOriginal)
}
}
그런 다음 xib 파일의 Identity Inspector에서 런타임 속성을 추가합니다.
.xib
파일이 아니라 .xcassets
라이브러리 에서 이미지 렌더링 모드를 설정할 수 있습니다 .
자산 라이브러리에 이미지를 추가 한 후 이미지를 선택하고 Xcode의 오른쪽에서 속성 관리자를 엽니 다. 'Render As'속성을 찾아 'template'으로 설정합니다.
이미지의 렌더링 모드를 설정 한 후 틴트 색상을 UIImageView
.xib
또는 에.storyboard
파일 하여 이미지 색상을 조정할 수 있습니다.
이것은 하나의 인터페이스 작성기 파일이 아닌 사용되는 위치에 관계없이 이미지의 속성을 설정하지만 거의 모든 경우 (내가 본 적이있는) 이것이 원하는 동작입니다.
참고할 몇 가지 사항 :
UIImageView
. 나는 그것을 깊이 조사하지 않았습니다.UIKitComponents
이미지와 같은 다른 것에서도 잘 작동합니다 .UIButton
UIBarButtonItem
UIImageView
. 따라서 앱을 실행할 때 색조 색상이 항상 표시되지는 않습니다.
스토리 보드 또는 xib에서 UIImageView와 함께 템플릿 렌더링 모드를 사용하는 것은 iOS 7 및 iOS 8 모두에서 매우 버그가 많습니다.
UIImage가 스토리 보드 / xib에서 제대로 디코딩되지 않았습니다. 메서드 에서 imageView.image.renderingMode
속성 을 검사하면 xcassets 파일에서 Render As Template Image 로 설정하더라도 viewDidLoad
항상임을 알 수 있습니다.UIImageRenderingModeAutomatic
이 문제를 해결하려면 렌더링 모드를 수동으로 설정해야합니다.
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
UIImage가 올바르게 디코딩되고 해당 renderingMode
속성이 xcassets 파일에서 선택한 항목을 반영하지만 이미지에 색조가 적용되지 않습니다.
이 문제를 해결하려면 두 가지 옵션이 있습니다.
tintColor
에서 속성을 설정합니다 .또는
UIColor *tintColor = self.imageView.tintColor;
self.imageView.tintColor = nil;
self.imageView.tintColor = tintColor;
원하는 옵션을 선택할 수 있으며 둘 다 이미지에 적절한 색조를 적용 할 수 있습니다.
(Xcode 6.2로 컴파일하는 경우 self.imageView.tintColor = self.imageView.tintColor;
에는 충분하지만 Xcode 6.3으로 컴파일하는 경우 더 이상 작동하지 않습니다.)
iOS 7과 iOS 8을 모두 지원해야하는 경우 두 가지 해결 방법이 모두 필요합니다. iOS 8 만 지원해야하는 경우 하나의 해결 방법 만 필요합니다.
확장자를 사용하여 .xib 문제를 해결할 수 있습니다.
import UIKit
// fixing Bug in XCode
// http://openradar.appspot.com/18448072
extension UIImageView {
override open func awakeFromNib() {
super.awakeFromNib()
self.tintColorDidChange()
}
}
출처 : https://gist.github.com/buechner/3b97000a6570a2bfbc99c005cb010bac
놀랍게도이 버그는 4 ~ 5 년 동안 존재했습니다.
또는 renderingMode
에서 설정할 수 없습니다 . 프로그래밍 방식으로 액세스 할 수 있습니다.storyboard
xib
전의:
UIImage *unSeletedImage = [UIImage imageNamed:@"UnSelected.png"];
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
UIImage *selectedImage = [unSeletedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
Storyboard에서 tintColor 및 Class를 설정합니다.
//
// TintColoredImageView.swift
// TintColoredImageView
//
// Created by Dmitry Utmanov on 14/07/16.
// Copyright © 2016 Dmitry Utmanov. All rights reserved.
//
import UIKit
@IBDesignable class TintColoredImageView: UIImageView {
override var image: UIImage? {
didSet {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}
override init(image: UIImage?) {
super.init(image: image)
initialize()
}
override init(image: UIImage?, highlightedImage: UIImage?) {
super.init(image: image, highlightedImage: highlightedImage)
initialize()
}
func initialize() {
let _tintColor = self.tintColor
self.tintColor = nil
self.tintColor = _tintColor
}
}
고치는 것은 매우 쉽습니다
UIImageViewPDF 클래스를 만들고 스토리 보드에서 사용하기 만하면됩니다.
IB_DESIGNABLE
@interface UIImageViewPDF : UIImageView
@end
@implementation UIImageViewPDF
- (void) didMoveToSuperview
{
[super didMoveToSuperview];
self.image = [self.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
id color = self.tintColor;
self.tintColor = color;
}
@end
또 다른 해결책은 UIImageView
하위 클래스 를 만드는 것입니다 .
final class TemplateImageView: UIImageView {
override func awakeFromNib() {
super.awakeFromNib()
guard let oldImage = image else { return }
image = nil
image = oldImage.withRenderingMode(.alwaysTemplate)
}
}
그런 다음 Interface Builder의 클래스를 TemplateImageView
.
Storyboard에서 설정하는 간단한 방법 :
@IBDesignable
public class CustomImageView: UIImageView {
@IBInspectable var alwaysTemplate: Bool = false {
didSet {
if alwaysTemplate {
self.image = self.image?.withRenderingMode(.alwaysTemplate)
} else {
self.image = self.image?.withRenderingMode(.alwaysOriginal)
}
}
}
}
iOS 10 및 Swift 3에서 잘 작동합니다.
IBOutlet을 만들면 awakeFromNib 메서드에서 다음과 같이 변경할 수 있습니다.
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
@Moby의 대답이 더 정확하지만 이것은 더 간결 할 수 있습니다.
extension UIImageView {
@IBInspectable var renderModeTemplate : Bool {
get{
return image?.renderingMode == .alwaysTemplate
}
set{
image = image?.withRenderingMode(newValue ? .alwaysTemplate:.alwaysOriginal)
}
}
}
스토리 보드에있는 UIImageView 선택 관리자, 설정 특성 선택 renderModeTemplate
= On
에서 스토리 보드를