아마도 네 개의 다른보기가 필요하지 않을 것입니다. 여덟 개가 필요합니다. 아홉 개 슬라이스 각각 수평 및 수직 스케일링의 상이한 조합을 요구할 수있다
+----+-----+---------+
| | | |
+----+-----+---------|
| |fixed| |
| | | |
+----+-----+---------+
| | | |
| | | |
| | | |
+----+-----+---------+
주의 : 내측 "고정"사각형 조각으로 구 뷰를 분할한다. 그것은 다음과 같이 찾고 끝 :
을 어쨌든, 그냥 drawRect:
을 재정의하는 UIView
하위 클래스를 만들어이 일을 너무 열심히하지 않을 거라 생각 했어요.
나는 나의 서브 클래스
OutstretchView
이름과 세 속성 주었다
@interface OutstretchView : UIView
@property (nonatomic) UIImage *image;
@property (nonatomic) CGRect fixedRect; // in image coordinates
@property (nonatomic) CGPoint fixedCenter; // in view coordinates
@end
fixedRect
속성을 뻗어 안됩니다 이미지의 부분을 정의합니다. fixedCenter
속성은 뷰에서 이미지의 일부분을 그려야하는 위치를 정의합니다.
이미지의 9 개 슬라이스를 실제로 그리려면 이미지 좌표에서 CGRect
및 뷰 좌표에서 CGRect
을 사용하고 뷰의 지정된 부분에 이미지의 지정된 부분을 그려주는 메서드를 정의하는 것이 유용합니다 . 나는 석영 2D의 클립을 사용하고 CTM은 "무거운"할 기능 :
- (void)drawRect:(CGRect)imageRect ofImage:(UIImage *)image inRect:(CGRect)viewRect {
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSaveGState(gc); {
CGContextClipToRect(gc, viewRect);
CGContextTranslateCTM(gc, viewRect.origin.x, viewRect.origin.y);
CGContextScaleCTM(gc, viewRect.size.width/imageRect.size.width, viewRect.size.height/imageRect.size.height);
CGContextTranslateCTM(gc, -imageRect.origin.x, -imageRect.origin.y);
[image drawAtPoint:CGPointZero];
} CGContextRestoreGState(gc);
}
가 나는 또한 두 개의 X 좌표의 배열과 두 개의 Y 좌표의 배열에서 CGRect
을 만드는 작은 도우미 메서드를 사용합니다을 :
static CGRect rect(CGFloat *xs, CGFloat *ys) {
return CGRectMake(xs[0], ys[0], xs[1] - xs[0], ys[1] - ys[0]);
}
drawRect:
을 구현할 수 있습니다.그릴에 이미지, 또는 전혀 정의 fixedRect
중이없는 경우 우선 I은 쉽게 경우를 처리 : 다음
- (void)drawRect:(CGRect)dirtyRect {
UIImage *image = self.image;
if (!image)
return;
CGRect imageBounds = (CGRect){ CGPointZero, image.size };
CGRect viewBounds = self.bounds;
CGRect imageFixedRect = self.fixedRect;
if (CGRectIsNull(imageFixedRect)) {
[image drawInRect:viewBounds];
return;
}
I는 뷰 사각형의 화상의 고정 된 부분이 인출되는 위치 좌표를 계산한다 :
CGPoint imageFixedCenter = self.fixedCenter;
CGRect viewFixedRect = CGRectOffset(imageFixedRect, imageFixedCenter.x - imageFixedRect.size.width/2, imageFixedCenter.y - imageFixedRect.size.height/2);
다음에는 뷰 좌표 공간에서 슬라이스의 가장자리를 정의하는 4 개의 (네, 네 개의) X 좌표 배열과 Y 좌표에 대한 유사한 배열 및 이미지 좌표 공간에있는 좌표에 대한 두 개의 배열 :
CGFloat viewSlicesX[4] = { viewBounds.origin.x, viewFixedRect.origin.x, CGRectGetMaxX(viewFixedRect), CGRectGetMaxX(viewBounds) };
CGFloat viewSlicesY[4] = { viewBounds.origin.y, viewFixedRect.origin.y, CGRectGetMaxY(viewFixedRect), CGRectGetMaxY(viewBounds) };
CGFloat imageSlicesX[4] = { imageBounds.origin.x, imageFixedRect.origin.x, CGRectGetMaxX(imageFixedRect), CGRectGetMaxX(imageBounds) };
CGFloat imageSlicesY[4] = { imageBounds.origin.y, imageFixedRect.origin.y, CGRectGetMaxY(imageFixedRect), CGRectGetMaxY(imageBounds) };
그리고 마지막으로 쉬운 부분, 드로잉 조각 :
for (int y = 0; y < 3; ++y) {
for (int x = 0; x < 3; ++x) {
[self drawRect:rect(imageSlicesX + x, imageSlicesY + y) ofImage:image inRect:rect(viewSlicesX + x, viewSlicesY + y)];
}
}
}
그것은 내 아이 패드 2
내 테스트 프로젝트의이 버전은 on github 인에 약간 랙이 있습니다.
와우, 탁월한 질문 ... 내 생각 과정은 가짜 일 것입니다. 검정색 오버레이를 추가하지만 UIView는 검은 오버레이 아래에 imageView라고 말하는 부분을 실제로 투영하는 방식을 따릅니다. – CodaFi
하지만 아래 부분에 검은 색 오버레이가 어떻게 보이나요? 내용 rect에 투명 비트가 있다고 가정합니다. –
다음은 확대 할 내용으로 UIViews를 허용하는 돋보기 뷰 링크입니다. 구현을 연구하지 않아 구체적인 정보를 제공 할 수는 없지만 약속대로 작동합니다. https://github.com/acoomans/iOS-MagnifyingGlass – CodaFi