айфон, воспроизведите эффект лупы - PullRequest
19 голосов
/ 09 января 2010

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

Понятия не имею, с чего начать, есть идеи?

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

Ответы [ 3 ]

16 голосов
/ 09 января 2010

Мы делаем это в кроссвордах. В вашем методе 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];
}
4 голосов
/ 28 октября 2010

Здесь приведен полный пример .В загруженном проекте есть небольшая ошибка, но в остальном он отлично работает и делает именно то, что вам нужно.

1 голос
/ 17 января 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...