2010-01-08 2 views
19

Я хотел бы иметь возможность создать движущуюся лупу (например, ту, которая у вас есть, когда вы копируете и вставляете) в пользовательское представление, для увеличения части моего представления.iPhone, воспроизводит эффект лупы

Я понятия не имею, с чего начать, у вас есть идеи?

Заранее спасибо за помощь :)

+0

Интересный вопрос. Никаких идей, хотя. –

ответ

16

Мы делаем это в кроссворды. В методе drawRect маскируйте круг (используя монохромное растровое изображение, содержащее «маску» вашего увеличительного стекла) и нарисуйте изображение вашего объекта там с преобразованием масштаба 2x. Затем нарисуйте изображение увеличительного стекла над этим, и все готово.

- (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

Я использую этот код в Swift 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 
     } 
    } 
} 

Вам нужно позвонить setNeedsDisplay в scrollViewDidScroll:, если ваш вид чтения является Scrollview.

Смежные вопросы