UIView 설정은 원거리 렌더링을 트리거하지 않는 필렛입니다.

5119 단어
우리가 하나의 View에 원각을 설정해야 할 때, 일반 코드는 이렇다
_label.layer.cornerRadius = 10;
_label.layer.masksToBounds = YES;

Radius와maskToBounds가 독립적으로 작용할 때 큰 성능 문제가 없지만 둘이 결합하면 스크린 렌더링을 촉발한다. Instrument의Core Animation에는 Color Offscreen-Rendered Yellow라는 옵션이 있다.화면 바깥 버퍼에 렌더링된 영역을 노란색으로 표시하고 다음 그림의 노란색 부분은 화면에서 렌더링된 부분입니다.

원거리 렌더링은 무엇입니까?


화면 렌더링에서 레이어 트레이의 일부분을 새 캐시로 렌더링합니다. (이 캐시는 화면이 아니라 다른 곳입니다.) 그리고 이 캐시를 화면 위에 렌더링합니다.일반적으로 말하면, 너는 스크린에서 과장되는 것을 피해야 한다.이 비용은 매우 많기 때문이다.화면 위에서 직접 층을 합성하는 것은 먼저 스크린 캐시를 만들고 캐시 위에 그리는 것보다 훨씬 빠르고, 마지막에 스크린 위에 캐시를 그리는 것보다 훨씬 빠르다.이 안에는 두 개의 상하문 환경의 전환(화면 외부 캐시 환경과 화면 환경으로 전환)이 있다.

솔루션


만약view가 하위 보기의 일부분을 초과하여 표시하지 않고,view의 이미지에 원각을 그릴 필요가 없다면,
cornerRadius 속성에 대한 설명을 볼 수 있습니다.
By default, the corner radius does not apply to the image in the layer’s contents property; it applies only to the background color and border of the layer. However, setting the masksToBounds property to true causes the content to be clipped to the rounded corners.

이 속성은layer의 배경색과border에 영향을 줄 수 있기 때문에 아래 코드는 스크린에서 렌더링을 피할 수 있습니다.masksToBounds 속성을 설정하지 않아도 필렛을 설정할 수 있습니다.
view.layer.cornerRadius = radius;
view.layer.backgroundColor = backgroundColor.CGColor;

그러나 뷰의 이미지에 UIImageView와 같은 원각을 그려야 합니다.이미지 및 UIButton 배경 그림
GraphicsContext로 원각이 있는 이미지를 그려서view에 보여줌으로써 화면을 벗어날 수 있습니다.
나는 이 과정을 봉인했다

JMRoundedCorner를 사용하여 필렛 그리기

platform :ios, '7.0'

pod 'JMRoundedCorner'

#import "UIView+RoundedCorner.h"

view에 원각 테두리 설정하기
- (void)jm_setCornerRadius:(CGFloat)radius withBorderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth;

view에 원각 배경 색상 설정하기
- (void)jm_setCornerRadius:(CGFloat)radius withBackgroundColor:(UIColor *)backgroundColor;

view에 원각 배경도를 설정합니다
- (void)jm_setCornerRadius:(CGFloat)radius withImage:(UIImage *)image;

view에 콘텐츠 모드 모드의 원각 배경도를 설정합니다
- (void)jm_setCornerRadius:(CGFloat)radius withImage:(UIImage *)image contentMode:(UIViewContentMode)contentMode;

모든 속성을 설정하여 원각 배경도를 설정합니다
- (void)jm_setCornerRadius:(CGFloat)radius withBorderColor:(UIColor *)borderColor borderWidth:(CGFloat)borderWidth backgroundColor:(UIColor *)backgroundColor backgroundImage:(UIImage *)backgroundImage contentMode:(UIViewContentMode)contentMode;

코드 예
    _avatarView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 7, 40, 40)];
    [_avatarView jm_setCornerRadius:20 withImage:[UIImage imageNamed:@"avatar.jpg"]];
    [self.contentView addSubview:_avatarView];
//     
    _avatarView.image = [placeholderImage jm_imageWithRoundedCornersAndSize:CGSizeMake(60, 60) andCornerRadius:30];

//          image
[[SDWebImageManager sharedManager] downloadImageWithURL:_model.avatarURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
    if (image) {
        [_avatarView jm_setCornerRadius:30 withImage:image];
    }
}];

이렇게 하면 원각을 그려서 대량의view가 화면에서 렌더링될 때 FPS를 늦추는 것을 피할 수 있다
데모를 내려 JMRounded Corner가 가져온 매끄러운 승급을 사용해 보세요.
JMRadius를 통해 각도 우선 순위는 왼쪽 위 > 오른쪽 위 > 왼쪽 아래 > 오른쪽 아래 > 오른쪽 아래로 4개의 각도를 설정할 수 있습니다. 예를 들어:
[_label jm_setJMRadius:JMRadiusMake(0, 10, 0, 10) withBorderColor:[UIColor redColor] borderWidth:0.5];

연락 주세요.

  • QQ:337519524
  • 메일박스:[email protected]

  • 감사

  • reviewcode.cn
  • Getting Pixels Onto the Screen

  • 성능상의 장단점


    장점: 스크린 렌더링이 없고 이미지의 픽셀 크기를 조정하여 불필요한 축소를 피합니다
    단점: 도면층이 혼합되고 둥근 그림만 그려져 있기 때문에 하위 보기가 둥근 부분을 넘어서 보이지 않을 수 없습니다.

    주의 사항


    메모리가 지속적으로 증가하는 것은 정상적인 현상이다. 홈 키를 누르면 메모리가 정상 수준으로 돌아가고 메모리가 누출된 것이 아니라 그려진 캐시만 메모리가 부족할 때 자동으로 방출된다.
    view의 backgroundColor를 설정하지 마십시오. 설정하려면 backgroundColor 파라미터가 있는 인터페이스를 통해 설정할 수 있습니다. 예를 들어:
    - (void)jm_setCornerRadius:(CGFloat)radius withBackgroundColor:(UIColor *)backgroundColor;
    

    컨트롤러가 다음 오류를 내보냅니다. 이것은 Xcode-7의 BUG입니다.
    : CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
    

    Swift 버전: JMRoundedCornerSwift


    업데이트 로그

  • 2016/4/25 1.2.1 버전: 디스패치 대신 NSOperationQueuequeue, 원각을 반복해서 설정할 때 자동으로 cancel에서 지난번 동작을 합니다. kudocc의pull request에 감사드립니다.
  • 2016/3/12 1.1.0 버전: 인터페이스에 jm접두사, JMRadius는 원각 우선 순위를 추가하고, 대량의 테스트를 거쳐 세부 사항의 작은 BUG를 해결합니다.
  • 2016/3/3 1.0.3 버전: label에 한자가 없으면 문자가 표시되지 않는 BUG를 복원하고view를 픽셀에 떨어뜨리는 최적화를 했다.
  • 2016/2/28 1.0.0 버전: 공식 버전 발표
  • 2016/2/26 0.0.4 버전: 사이즈 매개 변수 제거 및 JMRadius 지원 4개 각도 다른 호도 설정
  • 2016/2/25 0.0.3 버전: UIImageView라는 중간 컨트롤 제거
  • 2016/2/24 0.0.2 버전: 배경 그림 설정 지원 그리기 모드(cotentmode)
  • 2016/2/23 0.0.1 버전: 원각 이미지 그리기
  • 좋은 웹페이지 즐겨찾기