그것은 수정할 수 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
파일 하여 이미지 색상을 조정할 수 있습니다.
이것은 하나의 인터페이스 작성기 파일이 아닌 사용되는 위치에 관계없이 이미지의 속성을 설정하지만 거의 모든 경우 (내가 본 적이있는) 이것이 원하는 동작입니다.
참고할 몇 가지 사항 :
- 이미지 색상은 인터페이스 빌더 (Xcode 6.1.1 기준)에서 변경된 것처럼 보이지 않지만 애플리케이션이 실행될 때 작동합니다.
- 나는이 기능에 약간의 버그를 경험했고 어떤 상황에서 나는 제거하고 다시 추가해야했다
UIImageView
. 나는 그것을 깊이 조사하지 않았습니다. - 이것은 또한 의 및 의
UIKitComponents
이미지와 같은 다른 것에서도 잘 작동합니다 .UIButton
UIBarButtonItem
- 자산 라이브러리에서 보이지 않는 흰색 이미지가 많이있는 경우 검은 색 / 투명한 이미지로 만들고 렌더링 모드를 변경하면 삶이 최대 10 배 향상됩니다.
답변
스토리 보드 또는 xib에서 UIImageView와 함께 템플릿 렌더링 모드를 사용하는 것은 iOS 7 및 iOS 8 모두에서 매우 버그가 많습니다.
iOS 7에서
UIImage가 스토리 보드 / xib에서 제대로 디코딩되지 않았습니다. 메서드 에서 imageView.image.renderingMode
속성 을 검사하면 xcassets 파일에서 Render As Template Image 로 설정하더라도 viewDidLoad
항상임을 알 수 있습니다.UIImageRenderingModeAutomatic
이 문제를 해결하려면 렌더링 모드를 수동으로 설정해야합니다.
self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
iOS 8에서
UIImage가 올바르게 디코딩되고 해당 renderingMode
속성이 xcassets 파일에서 선택한 항목을 반영하지만 이미지에 색조가 적용되지 않습니다.
이 문제를 해결하려면 두 가지 옵션이 있습니다.
- 속성 관리자 창 대신 사용자 정의 런타임 속성
tintColor
에서 속성을 설정합니다 .
또는
- 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 만 지원해야하는 경우 하나의 해결 방법 만 필요합니다.
답변
스토리 보드에서 색조 색상을 사용하도록 imageView RenderingMode를 설정하면 한 줄로 줄일 수 있습니다.
[self.imageView setImage:[self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
그런 다음 스토리 보드에서 이미지와 색조 색상을 모두 설정할 수 있습니다.
답변
확장자를 사용하여 .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];
답변
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
}
}