IT

스토리 보드 / xib 파일에서 UIImage renderingMode 수정

lottoking 2020. 9. 8. 08:12
반응형

스토리 보드 / xib 파일에서 UIImage renderingMode 수정


그것은 바로 수의 UIImagerenderingMode스토리 보드 또는 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의 스크린 샷

참고할 몇 가지 사항 :

  • 이미지 색상은 인터페이스 빌더 (Xcode 6.1.1 기준)에서 변경된 것처럼 보이지만 애플리케이션이 실행될 때 작동합니다.
  • 이 기능에 약간의 버그가 발생하고 상황에 따라 .NET Framework를 제거하고 다시 추가해야 UIImageView합니다. 나는 그것을 깊이 조사하지 않다.
  • 이것은 또한 의 및 UIKitComponents이미지와 같은 다른 것에서 작동합니다 .UIButtonUIBarButtonItem
  • 자산 라이브러리에서 변경하는 경우 흰색 이미지가 많이있는 경우 검은 색 / 투명한 이미지로 작성 모드를 변경합니다.

스토리 보드 또는 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
    }

}

고치는 것은 매우 쉽습니다

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