UIImageView에서 필렛을 추가하는 몇 가지 방법

2330 단어
나를 좋아하는 나의 개인 블로그: RobberJJ
UIImageView 객체를 작성하려면 다음과 같이 하십시오.
UIImageView * poImgView = [[UIImageView alloc] init];

첫번째 방법
poImgView.layer.cornerRadius = poImgView.frame.size.width/2.0;
poImgView.layer.masksToBounds = YES;
(  poImgView.clipsToBounds = YES;)

clipsToBounds는view에 대한 절단이고 masksToBounds는layer에 대한 절단입니다.
성능 소모: 이것은 스크린 렌더링(off-screen-rendering)으로 성능에 대한 소모가 비교적 크다.fps는 대체로 45 프레임 정도(cell당 2개의imageview)(정상 fps는 60 프레임으로 작을수록 사용자 체험이 떨어진다).
리플렉스 렌더링은 현재 화면 버퍼 외부에 GPU가 렌더링 작업을 위해 새로운 버퍼를 여는 것을 의미합니다.위의 결론에 의하면 보기와 원각의 크기는 프레임률에 아무런 영향을 주지 않고 수량이야말로 피해의 핵심 출력이다.스크린에서 렌더링하는 데 걸리는 시간은 스크린에서 렌더링하는 동작이 아니라 스크린에서 렌더링하는 동작에서 발생한다는 것을 알 수 있다.왜 이렇게 화면을 떠나는 데 시간이 걸립니까?원인은 주로 버퍼 생성과 상하문 전환이 있습니다.새로운 버퍼를 만드는 대가가 크지 않고, 가장 큰 대가를 치르는 것은 상하문 전환이다.
두 번째 방법
CAShapeLayer *layer = [CAShapeLayer layer];  
UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:aImageView.bounds];  
layer.path = aPath.CGPath;  
poImgView.layer.mask = layer;

성능 소모: 테스트 fps는 대략 20 프레임 정도이고 방안 A의 소모보다 크다.
세 번째 방법
- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
    CGRect rect = (CGRect){0.f, 0.f, self.size};
    UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
    CGContextAddPath(UIGraphicsGetCurrentContext(),[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
    CGContextClip(UIGraphicsGetCurrentContext());
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

성능 소모: 이것은on-screen-rendering은 시시각각 렌더링을 하는 것과 같고 A.B 방안의 오프라인 렌더링에 비해 성능 소모가 가장 적기 때문에 이 방안을 추천합니다.
특히 첫 번째와 두 번째 방법은 모두 비교적 흔히 볼 수 있는 방식이지만 모두 추천하지 않는다. 이에 대한 최적화 방안은 세 번째 방식이지만 굳이 첫 번째와 두 번째 방법을 사용해야 한다면 보완 조치는 다음과 같다.
self.layer.shouldRasterize = YES;  
self.layer.rasterizationScale = [UIScreen mainScreen].scale;

shouldRasterize가true로 설정되었을 때,layer는bitmap으로 렌더링되고 캐시되어 있으며, 다음에 사용할 때 다시 렌더링되지 않습니다.
원각을 실현하는 것 자체가 색 혼합(blending)을 하는 것이다. 만약에 페이지가 나올 때마다blending이 너무 많이 소모된다면 이때shouldRasterize=yes, 다음에는 렌더링 엔진의cache에서 그bitmap을 간단하게 읽고 시스템 자원을 절약할 뿐이다.
TableView를 스크롤할 때, 매번 원각 설정을 실행하면 UI를 막을 것입니다. 이 설정을 사용하면 슬라이딩이 더욱 원활해질 것입니다.

좋은 웹페이지 즐겨찾기