[ios] 스토리 보드 / 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’으로 설정합니다.

이미지의 렌더링 모드를 설정 한 후 틴트 색상을 UIImageView.xib 또는 에.storyboard 파일 하여 이미지 색상을 조정할 수 있습니다.

이것은 하나의 인터페이스 작성기 파일이 아닌 사용되는 위치에 관계없이 이미지의 속성을 설정하지만 거의 모든 경우 (내가 본 적이있는) 이것이 원하는 동작입니다.

이미지 속성 검사기를 보여주는 Xcode의 스크린 샷

참고할 몇 가지 사항 :

  • 이미지 색상은 인터페이스 빌더 (Xcode 6.1.1 기준)에서 변경된 것처럼 보이지 않지만 애플리케이션이 실행될 때 작동합니다.
  • 나는이 기능에 약간의 버그를 경험했고 어떤 상황에서 나는 제거하고 다시 추가해야했다 UIImageView . 나는 그것을 깊이 조사하지 않았습니다.
  • 이것은 또한 의 및 의 UIKitComponents이미지와 같은 다른 것에서도 잘 작동합니다 .UIButtonUIBarButtonItem
  • 자산 라이브러리에서 보이지 않는 흰색 이미지가 많이있는 경우 검은 색 / 투명한 이미지로 만들고 렌더링 모드를 변경하면 삶이 최대 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 파일에서 선택한 항목을 반영하지만 이미지에 색조가 적용되지 않습니다.

이 문제를 해결하려면 두 가지 옵션이 있습니다.

  1. 속성 관리자 창 대신 사용자 정의 런타임 속성tintColor 에서 속성을 설정합니다 .

또는

  1. 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에서 설정할 수 없습니다 . 프로그래밍 방식으로 액세스 할 수 있습니다.storyboardxib

전의:

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
    }

}