2012-07-04 4 views
3

다음 작업을 수행하지 않고 둥근 UIImages를 그리는 방법이 있습니까? 내가 클리핑 패스와 함께iOS에서 둥근 아바타 이미지 및 성능 문제

  1. 의 drawRect을 시도했습니다
  2. 의 drawRect

  1. 블렌딩 (코어 애니메이션 인 스트 루먼트 레드)
  2. 오프 스크린 렌더링 (노란색 코어의 애니메이션 악기) . 이것은 너무 느립니다. (참조 : http://developer.apple.com/library/ios/#qa/qa1708/_index.html)
  3. maskLayer를 사용하여 CALayer 내용. 이것은 오프 스크린 렌더링을 도입합니다.
  4. UIImageView 및 cornerRadius 및 masksToBounds 설정. 이것은 # 2와 같은 효과가 있습니다.

최후의 대책은 이미지를 직접 수정하는 것입니다. 어떤 제안?

+0

당신이 해결하고있는 비즈니스 문제에 대해 조금 설명 할 수 있습니까? 둥근 모서리로 앱에 이미지를 표시하는 것만으로도 충분합니까? 아니면 이러한 이미지를 조작하거나 저장해야합니까? 너 뭐하려고? 근본적인 최적화를 찾고 있다면, 우리가 부과하고있는 (또는 더 중요하게 부과하지 않는) 종류의 제약에 대한 감을 우리에게 제공해야합니다. – Rob

+0

피드에서 uitableview 스크롤링 성능과 관련이 있습니다. – bogardon

+0

나는 비슷한 문제를 다루었으며 약간의 연구를했는데, 나의 연구 결과는 나의 대답에 반영되었다.결론적으로, 가장 느린 장치를 제외하고 성능에 미치는 영향은별로 없었지만 보조 대기열에서 반올림에서부터 tableview의 이미지 모서리를 덮는 이미지 오버레이에 이르기까지 모든 작업을 수행했습니다. 아래의 업데이트 된 답변을 참조하십시오. – Rob

답변

3

나는 blog.sallarp.com's rounded corners algorithm의 변형을 사용합니다. 광산을 특정 코너 만 돌릴 수 있도록 수정했으며 원활한 통합을위한 카테고리이지만 링크를 통해 기본적인 아이디어를 얻을 수 있습니다. 이 기술이 거부 된 기술 중 하나 인 "오프 스크린 렌더링"으로 간주 될 수 있다고 생각하지만 완전히 확신 할 수는 없습니다. 관찰 가능한 성능 문제는 본 적이 없지만 특별한 상황이 발생할 수 있습니다.

둥근 모서리 모양을 나타 내기 위해 이미지 뷰 위에 모서리의 이미지 뷰를 오버레이 할 수 있습니까?

또는 모서리가 둥글게되어 성능이 저하 될 우려가있는 경우 이미지의 둥근 모서리가있는 이미지 사본을 앱에 저장하면 처음으로 성능이 저하됩니다. 이 기능은 "이미지를 직접 수정"하는 개념과 동일하지만 시간에 맞춰 작업을 수행합니다.

업데이트 :

결론은, 나는 (내 미봉책 아이디어, 아래의 포인트 # 2의 줄임말) 다른 솔루션을 알고하지 않습니다. 하지만 몇 가지 실험을했다 (나는 비슷한 문제를 다루는 거니까) 다음과 같은 결론에 온 : 당신은 3GS 이상 장치에서 반올림 성능이있는 경우

  1. 이 문제가 될 수 없습니다 모서리의 반올림. 3G에서 UI에 중대한 영향을 미쳤지 만 3GS에서는 간신히 눈에 띄지 않았고 이후 장치에서는 인식 할 수 없었습니다. 둥근 모서리의 성능 문제가있는 경우 반올림하고 다른 것이 아닌지 확인하십시오. 이전에 캐시 된 이미지의 구석을 제때에 반올림 한 경우 반올림이 무시할만한 영향을 미쳤다는 것을 알게되었습니다. (캐싱하기 전에 반올림을했을 때 UI는 실크처럼 매끄러웠다.)

  2. 마스킹의 대안은 둥근 모서리의 반전 된 이미지를 만드는 것이다. 모서리, 투명한 이미지를 표시 할 곳)를 선택하고이 이미지를 tableviewcell 이미지 앞에 놓습니다. 이 기능이 작동하려면 사용자 정의 셀 (예 : 내 기본 이미지보기 컨트롤, 내 레이블,이 코너 마스크 이미지보기 컨트롤)을 만들어야한다는 것을 알았지 만, JIT (Just-In-Time)보다 확실히 좋았습니다. 모퉁이 둥근 알고리즘의 호출.그룹화 된 테이블에서 모서리를 둥글 린 경우이 방법이 효과가 없을 수 있지만 반올림하지 않고 둥근 모서리가 나타나기를 원한다면 귀여운 해킹입니다.

  3. 그룹화 된 테이블 뷰를 사용하고 있기 때문에 모서리를 반올림하고 둥근 모서리에 이미지가 흘러 나오지 않는다면 첫 번째 행의 이미지의 왼쪽 위 모서리와 왼쪽 아래 모서리를 반올림하면됩니다 마지막 이미지의 모서리. 이렇게하면 모서리 라운딩 논리가 호출되는 횟수가 줄어 듭니다. 그것은 또한 좋아 보인다.

  4. 나는 당신이 이것에 대해 물어 보지 않았다 알고 있지만 tableviews의 이미지에 대한 다른 가능한 성능 문제는 다음과 같습니다

    • 당신이 cellForRowAtIndexPath에 (캐시하지 않습니다) imageWithContentsOfFile 같은 것을 사용하는 경우 , 당신은 확실히 성능 문제를 볼 수 있습니다. imageNamed 캐싱을 이용할 수 없다면 (어쨌든 어떤 사람들은 그것에 대해 불평 함), 적시에 또는 미리 예비 스레드에 이미지를 미리 캐싱 할 수 있습니다. 테이블 뷰가 이전에로드 된 이미지를 참조하고 성능이 크게 향상되는 경우 모서리 반올림이 여전히 문제 일 수 있습니다.

    • 다른 성능 문제의 원인으로는 tableview의 imageview에 맞게 크기가 최적화되지 않은 이미지를 사용하는 것이 있습니다. 큰 이미지는 성능에 큰 영향을 미쳤습니다. 여기에 자살하기 전에 라운딩을

  5. 결론

    ,

    • 유일한 성능 문제입니다. 내 경험상 영향을 무시할 수 있었기 때문에 현대 하드웨어에서 문제가 발생하는 경우 특히 그렇습니다. 게다가 더 넓은 해결책이 더 좋을 때, 너무 많은 수면을 느슨하게하는 것이 수치 스럽습니다. 크기 최적화 된 축소판 이미지가 아닌 이미지를 사용하면 이미지를 캐시하지 못하는 등의 작업이 모두 성능에 큰 영향을줍니다.

    • 가능한 한 미리 이미지의 모서리를 반올림하면 UI가 가장 좋으며보기 컨트롤러 코드가 멋지고 간단합니다.

    • 예를 들어 이미지를 실시간으로 다운로드하기 때문에 사전에 처리 할 수 ​​없다면 코너 마스킹 이미지 트릭을 시도 할 수 있지만 특정 상황에서만 작동합니다 (그룹화되지 않은 tableview 그들 중 하나입니다).

    • UI가 진행될 때 모서리를 둥글게 처리해야하는 경우 별도의 대기열에서 모서리를 반올림하고 UI를 차단하지 마십시오.

1

그것은 내가 내가 그 성능과 일반적으로 행복 해요 무엇 :

UIImageView *iv=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"769-male"]]; 
UIGraphicsBeginImageContextWithOptions(iv.bounds.size, NO, [UIScreen mainScreen].scale); 
[[UIBezierPath bezierPathWithRoundedRect:v.bounds cornerRadius:s] addClip]; 
[image drawInRect:v.bounds]; 
v.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();