iOS 의 한 줄 코드 가 UIView 투각 효 과 를 실현 합 니 다.
임의의 모양 의 투각,문자 의 투각,투각 이 있 는 털 유리 효과 등 을 빠르게 구현 할 수 있 는 투각
UIView
효 과 를 실현 하 는 방안 이다.본질 적 으로UIView
의maskView
효과 다.머리말
우선 커버 효과 의 실현 을 복습 해 보 자.만약 우리 가 그림 한 장 을 가지 고 있 고,또 마침 원 이 있다 면,우리 가 원 을 그림 의 덮개 로 설정 할 때,이러한 결 과 를 얻 을 수 있 을 것 이다.
코드 구현 은 이렇게 보 입 니 다:
view.maskView = maskView;
그렇다면 문제 가 생 겼 다.만약 우리 가 아래 의 결 과 를 얻 기 를 원한 다 면 어떻게 해 야 할 까?이 는 원래 의 그림 층 에서 가 려 진 부분 을 빼 는 것 처럼 보인다.안 타 깝 게 도 애플 아버 지 는 마음 에 들 지 않 아 편리 한 인터페이스 호출 을 제공 하지 못 했다.어떻게 이 루어 질 수 있 는 지 봅 시다.
생각
우리 의 최종 목 표 는 인 터 페 이 스 를 봉인 하 는 것 이다.호출 방식 은
maskView
속성 과 유사 하여 하나UIView
에 쉽게 투각 효 과 를 낼 수 있다.주:아래 는
originView
효과 가 필요 한view
을 가리 키 며,maskView
가리 키 는 것 을 가리 키 는view
을 가리킨다.현재 로 서 는 두 가지 방향 에서 시작 할 수 있다.
originView
의 보 기 를 다시 그리고 그 릴 때maskView
의 영역 을 줄 이 는 것 을 말한다.방식 2 는
maskView
을 받 았 을 때maskView
자 체 를 먼저 처리 하고 커버 범 위 를 반대로 하 는 것 을 말한다.그 다음 에 커버 효 과 를 하면 커버 구역 이 반대 되 기 때문에 얻 은 결과 도 반대 이 고 투각 의 목적 을 달성 할 수 있다.보기 에는 방식 2 가 비교적 믿 을 만하 고 마지막 으로 호출
UIView
setMaskView:
을 통 해 이 루어 지 며 원래 가 려 진 특성 도 유지 할 수 있다.예 를 들 어 수정maskView
의frame
을 할 때originView
의 커버 위치 도 이에 따라 달라 진다.실현
상 반 된 커버 그림 을 만 드 는 것 은 세 단계 로 나 눌 수 있다.처음에 받 은 것
maskView
이 다음 과 같다 고 가정 하면 전환 과정 에서 커버 그림 의 모든 변 화 를 살 펴 보 자.주:보다 직관 적 인 효 과 를 위해 그림 의 투명 한 부분 은 회백색 상 간 격자 로 표시 한다(이하 동일).
1.
maskView
를UIImage
로 전환한다.
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.장군
CGContextRef
의alpha
값 을 옮 겨 다 니 며 변환 합 니 다.
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
자동 갱신 불가우 리 는
UIView
의maskView
내용 이 동태 적 으로 수정 되면UIView
에 실시 간 으로 반 영 될 것 이라는 것 을 안다.그러나 이 항목 에서subtractMaskView
속성 은 새로운 그림 을 생 성하 여 커버 그림 으로 사용 합 니 다.subtractMaskView
의 내용 에 따라 실시 간 으로 보 기 를 새로 고침 하지 않 기 때 문 입 니 다.업데이트 가 필요 하 다 면 마스크 그림 을 다시 만 들 기 위해 수 동 으로setSubtractMaskView:
방법 을 사용 해 야 합 니 다.2.
setSubtractMaskView:
자주 호출 되 어 서 는 안 된다.setSubtractMaskView:
본질 적 으로 새로운 마스크 그림 을 만 드 는 과정 이다.이 과정 은 이미지 픽 셀 의 옮 겨 다 니 는 전환 과 관련 되 고 시간 이 많이 걸 리 므 로 자주 호출 하 는 것 이 좋 지 않다.다시 말 하면 이 방안 은 한 번 만 커버 그림 을 만 드 는 장면 에 적합 하 다.
소스 코드
GitHub에서 전체 코드 를 보십시오.
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 iOS 의 한 줄 코드 가 UIView 투각 효 과 를 실현 하 는 것 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 댓 글로 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.