UIView 설정은 원거리 렌더링을 트리거하지 않는 필렛입니다.
_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];
연락 주세요.
감사
성능상의 장단점
장점: 스크린 렌더링이 없고 이미지의 픽셀 크기를 조정하여 불필요한 축소를 피합니다
단점: 도면층이 혼합되고 둥근 그림만 그려져 있기 때문에 하위 보기가 둥근 부분을 넘어서 보이지 않을 수 없습니다.
주의 사항
메모리가 지속적으로 증가하는 것은 정상적인 현상이다. 홈 키를 누르면 메모리가 정상 수준으로 돌아가고 메모리가 누출된 것이 아니라 그려진 캐시만 메모리가 부족할 때 자동으로 방출된다.
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
업데이트 로그
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.