스토리 보드 / xib 파일에서 UIImage renderingMode 수정
그것은 바로 수의 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'으로 설정합니다.
렌더링-mode의 이미지를 설정 한 후 또는 파일 의 UIImageView
에 색조 개 색상을 추가 하여 이미지 개 색상을 조정할 수 있습니다..xib
.storyboard
이것은 하나의 인터페이스 작성기 파일이 아닌 사용되는 위치에 관계없이 이미지의 속성을 설정하지만 거의 모든 경우 (내가 본 적이있는) 이것이 원하는 동작입니다.
참고할 몇 가지 사항 :
- 이미지 색상은 인터페이스 빌더 (Xcode 6.1.1 기준)에서 변경된 것처럼 보이지만 애플리케이션이 실행될 때 작동합니다.
- 이 기능에 약간의 버그가 발생하고 상황에 따라 .NET Framework를 제거하고 다시 추가해야
UIImageView
합니다. 나는 그것을 깊이 조사하지 않다. - 이것은 또한 의 및 의
UIKitComponents
이미지와 같은 다른 것에서 작동합니다 .UIButton
UIBarButtonItem
- 자산 라이브러리에서 변경하는 경우 흰색 이미지가 많이있는 경우 검은 색 / 투명한 이미지로 작성 모드를 변경합니다.
스토리 보드 또는 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
}
}
고치는 것은 매우 쉽습니다
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에서 잘 작동합니다.
iOS 9 tintColor
에서 Interface Builder 의 속성 설정 은 여전히 버그가 있습니다.
ImageView
속성을 직접 수정하는 줄을 작성하는 것 외에 작동하는 솔루션 은 자산 카탈로그에서 Render As : Template Image를 설정하고 예를 들어 다음을 호출하는 것입니다.
[[UIImageView appearanceWhenContainedInInstancesOfClasses:@[[MyView class]]] setTintColor:[UIColor whiteColor]];
tintColor
인터페이스 빌더에 실행 속성을 추가 하여이 문제를 해결했습니다 .
참고 : 이미지를 Images.xcassets 파일에서 템플릿 이미지로 전송 설정해야합니다.
IBOutlet을 만들면 awakeFromNib 메소드에서 다음과 같이 설명 수 있습니다.
self.myImageView.image = [self.myImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
@Moby의 대답이 더 그렇다고합니다.
미친이 버그는 여전히 iOS 12.1에 있습니다! 스토리 보드 / xibs의 경우 : UIImageView에 태그를 추가하면 빠른 수정이 가능합니다.
스위프트 4.2
view.viewWithTag(1)?.tintColorDidChange()
참고 URL : https://stackoverflow.com/questions/19517334/modify-uiimage-renderingmode-from-a-storyboard-xib-file
'IT' 카테고리의 다른 글
코드 골프 : 피아노 (0) | 2020.09.08 |
---|---|
AWS CLI $ PATH 설정 (0) | 2020.09.08 |
빈 디렉토리 찾기 UNIX (0) | 2020.09.08 |
속성 값으로 배열을 필터링하는 Rails (0) | 2020.09.07 |
더 빠른 것 : in_array 또는 isset? (0) | 2020.09.07 |