iOS 의 한 줄 코드 가 UIView 투각 효 과 를 실현 합 니 다.


임의의 모양 의 투각,문자 의 투각,투각 이 있 는 털 유리 효과 등 을 빠르게 구현 할 수 있 는 투각UIView효 과 를 실현 하 는 방안 이다.본질 적 으로UIViewmaskView효과 다.
머리말
우선 커버 효과 의 실현 을 복습 해 보 자.만약 우리 가 그림 한 장 을 가지 고 있 고,또 마침 원 이 있다 면,우리 가 원 을 그림 의 덮개 로 설정 할 때,이러한 결 과 를 얻 을 수 있 을 것 이다.

코드 구현 은 이렇게 보 입 니 다:

view.maskView = maskView;
그렇다면 문제 가 생 겼 다.만약 우리 가 아래 의 결 과 를 얻 기 를 원한 다 면 어떻게 해 야 할 까?이 는 원래 의 그림 층 에서 가 려 진 부분 을 빼 는 것 처럼 보인다.

안 타 깝 게 도 애플 아버 지 는 마음 에 들 지 않 아 편리 한 인터페이스 호출 을 제공 하지 못 했다.어떻게 이 루어 질 수 있 는 지 봅 시다.
생각
우리 의 최종 목 표 는 인 터 페 이 스 를 봉인 하 는 것 이다.호출 방식 은maskView속성 과 유사 하여 하나UIView에 쉽게 투각 효 과 를 낼 수 있다.
주:아래 는originView효과 가 필요 한view을 가리 키 며,maskView가리 키 는 것 을 가리 키 는view을 가리킨다.
현재 로 서 는 두 가지 방향 에서 시작 할 수 있다.
  • 마스크 의 그리 기 과정 수정
  • maskView 자체 수정
  • 방식 1 은 이 속성 을 설정 할 때originView의 보 기 를 다시 그리고 그 릴 때maskView의 영역 을 줄 이 는 것 을 말한다.
    방식 2 는maskView을 받 았 을 때maskView자 체 를 먼저 처리 하고 커버 범 위 를 반대로 하 는 것 을 말한다.그 다음 에 커버 효 과 를 하면 커버 구역 이 반대 되 기 때문에 얻 은 결과 도 반대 이 고 투각 의 목적 을 달성 할 수 있다.
    보기 에는 방식 2 가 비교적 믿 을 만하 고 마지막 으로 호출UIViewsetMaskView:을 통 해 이 루어 지 며 원래 가 려 진 특성 도 유지 할 수 있다.예 를 들 어 수정maskViewframe을 할 때originView의 커버 위치 도 이에 따라 달라 진다.
    실현
    상 반 된 커버 그림 을 만 드 는 것 은 세 단계 로 나 눌 수 있다.처음에 받 은 것maskView이 다음 과 같다 고 가정 하면 전환 과정 에서 커버 그림 의 모든 변 화 를 살 펴 보 자.

    주:보다 직관 적 인 효 과 를 위해 그림 의 투명 한 부분 은 회백색 상 간 격자 로 표시 한다(이하 동일).
    1.maskViewUIImage로 전환한다.
    
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(),
               view.frame.origin.x,
               view.frame.origin.y);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    이 단 계 는maskView에 대응 하 는image이미 지 를 얻 었 다.이때 마스크 그림 의 크기 는originView크기 로 동기 화 됩 니 다.
    2.장군UIImage채널 만 있 는alpha채널 로 전환CGContextRef
    
    CGImageRef originalMaskImage = [image CGImage];
    float width = CGImageGetWidth(originalMaskImage);
    float height = CGImageGetHeight(originalMaskImage);
      
    int strideLength = ROUND_UP(width * 1, 4);
    unsigned char * alphaData = calloc(strideLength * height, sizeof(unsigned char));
    CGContextRef alphaOnlyContext = CGBitmapContextCreate(alphaData,
                               width,
                               height,
                               8,
                               strideLength,
                               NULL,
                               kCGImageAlphaOnly);
      
    CGContextDrawImage(alphaOnlyContext, CGRectMake(0, 0, width, height), originalMaskImage);
    
    이때alphaOnlyContext에 대응 하 는 그림 은 아래 와 같 고alpha채널 만 유지 합 니 다.
    3.장군CGContextRefalpha값 을 옮 겨 다 니 며 변환 합 니 다.
    
    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++) {
        unsigned char val = alphaData[y*strideLength + x];
        val = 255 - val;
        alphaData[y*strideLength + x] = val;
      }
    }
      
    CGImageRef alphaMaskImage = CGBitmapContextCreateImage(alphaOnlyContext);
    UIImage *result = [UIImage imageWithCGImage:alphaMaskImage];
    변환 후 획득 한result그림 은:

    그래서 우 리 는result로 즐겁게 진행 할 수 있다mask.
    사용
    우 리 는 상술 한 절 차 를 하나의 방법 으로 봉 하여category으로 실현 할 수 있다.
    
    @interface UIView (MFSubtractMask)
    - (void)setSubtractMaskView:(UIView *)view;
    - (UIView *)subtractMaskView;
    @end
    이렇게 호출 하면 매우 편리 합 니 다.한 줄 의 코드 가 해결 되 었 습 니 다.
    
    view.subtractMaskView = maskView;
    한계 성
    1.subtractMaskView자동 갱신 불가
    우 리 는UIViewmaskView내용 이 동태 적 으로 수정 되면UIView에 실시 간 으로 반 영 될 것 이라는 것 을 안다.그러나 이 항목 에서subtractMaskView속성 은 새로운 그림 을 생 성하 여 커버 그림 으로 사용 합 니 다.subtractMaskView의 내용 에 따라 실시 간 으로 보 기 를 새로 고침 하지 않 기 때 문 입 니 다.업데이트 가 필요 하 다 면 마스크 그림 을 다시 만 들 기 위해 수 동 으로setSubtractMaskView:방법 을 사용 해 야 합 니 다.
    2.setSubtractMaskView:자주 호출 되 어 서 는 안 된다.setSubtractMaskView:본질 적 으로 새로운 마스크 그림 을 만 드 는 과정 이다.이 과정 은 이미지 픽 셀 의 옮 겨 다 니 는 전환 과 관련 되 고 시간 이 많이 걸 리 므 로 자주 호출 하 는 것 이 좋 지 않다.
    다시 말 하면 이 방안 은 한 번 만 커버 그림 을 만 드 는 장면 에 적합 하 다.
     소스 코드
    GitHub에서 전체 코드 를 보십시오.
    총결산
    위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 iOS 의 한 줄 코드 가 UIView 투각 효 과 를 실현 하 는 것 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 댓 글로 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기