2010-01-08 2 views
19

내보기의 일부를 확대/축소하기 위해 사용자 정의보기에서 이동 가능한 돋보기 (복사하여 붙여 넣을 때와 같이)를 만들 수 있습니다.iPhone에서 돋보기 효과를 재현하십시오.

시작하는 방법에 대해 알지 못합니다. 아이디어가 있습니까?

미리 도움을 주셔서 감사합니다.

+0

흥미로운 질문입니다. 아이디어가 없습니다. –

답변

16

우리는 이것을 크로스 워드로합니다. drawRect 메서드에서 돋보기의 '마스크'가 포함 된 단색 비트 맵을 사용하여 원을 마스크 처리하고 2 배 스케일 변환을 사용하여 대상 뷰를 그립니다. 그 위에 돋보기 이미지를 그으면 끝난 것입니다.

- (void) drawRect: (CGRect) rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGRect   bounds = self.bounds; 
    CGImageRef  mask = [UIImage imageNamed: @"loupeMask"].CGImage; 
    UIImage   *glass = [UIImage imageNamed: @"loupeImage"]; 

    CGContextSaveGState(context); 
    CGContextClipToMask(context, bounds, mask); 
    CGContextFillRect(context, bounds); 
    CGContextScaleCTM(context, 2.0, 2.0); 

    //draw your subject view here 

    CGContextRestoreGState(context); 

    [glass drawInRect: bounds]; 
} 
+0

정말 흥미로운 소리. 반영을 모방하려고하는 오버레이를 추가해야합니다. 나는 그것을 시험 할 것이다. 고마워요! –

+0

잘 작동합니다. 감사합니다 –

+0

코드는 비 눈금 영역의 그림자를 지원하지 않습니다! 이 문제를 해결하는 방법? – Dmitry

4

완전한 예제 over here이 있습니다. 다운로드 한 프로젝트에 사소한 오류가 있지만 그렇지 않으면 잘 작동하고 정확히 필요한 것을 수행합니다.

+0

링크를 공유하기 위해 +1 – Cyprian

+0

답변에 관련 비트를 추출 할 수 있습니까? 링크가 계속 작동하는 것처럼 보이지만 실제로 유지 될 기간에 대한 보장은 없습니다. –

1

나는 스위프트 3에서이 코드를 사용 :

class MagnifyingGlassView: UIView { 

    var zoom: CGFloat = 2 { 
     didSet { 
      setNeedsDisplay() 
     } 
    } 

    weak var readView: UIView? 

    // MARK: - UIVIew 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     setupView() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setupView() 
    } 

    override func draw(_ rect: CGRect) { 
     guard let readView = readView else { return } 
     let magnifiedBounds = magnifyBounds(of: readView, zoom: zoom) 
     readView.drawHierarchy(in: magnifiedBounds, afterScreenUpdates: false) 
    } 

    // MARK: - Private 

    private func setupView() { 
     isOpaque = false 
     backgroundColor = UIColor.clear 
    } 

    private func magnifyBounds(of view: UIView, zoom: CGFloat) -> CGRect { 
     let transform = CGAffineTransform(scaleX: zoom, y: zoom) 
     var bounds = view.bounds.applying(transform) 
     bounds.center = view.bounds.center 
     return view.convert(bounds, to: self) 
    } 
} 

extension CGRect { 
    var center: CGPoint { 
     get { 
      return CGPoint(x: origin.x + width/2, y: origin.y + height/2) 
     } 
     set { 
      origin.x = newValue.x - width/2 
      origin.y = newValue.y - height/2 
     } 
    } 
} 

당신은 당신의 읽기 뷰가있는 ScrollView 경우 scrollViewDidScroll:setNeedsDisplay를 호출해야합니다.

관련 문제