Установить альфа-значение только для части UIImageView - PullRequest
0 голосов
/ 28 апреля 2018

Я поместил 2 UIImageViews друг на друга. Нижний - просто зеленое изображение, а верхний - синий. Кроме того, у меня есть UIView. Идея состоит в том, чтобы иметь возможность перетаскивать UIView вверх и вниз, и вместо того, чтобы видеть только зеленый цвет, UIView покажет нижнее изображение синего цвета внутри прямоугольника.

This is what it looks like

Я добавил в UIView Pan Gesture Recogniser, чтобы я мог перетаскивать его вверх и вниз, что прекрасно работает. Я попытался поискать в Интернете, чтобы узнать, как я могу изменить альфа зеленого изображения ТОЛЬКО внутри прямоугольника UIView, чтобы он выглядел как окно, но без какой-либо удачи. Это мой код:

import UIKit

class ViewController: UIViewController {

var windowViewOrigin: CGPoint!

@IBOutlet weak var topImageView: UIImageView!
@IBOutlet weak var bottomImageView: UIImageView!
@IBOutlet weak var windowView: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    addPanGesture(view: windowView)
    windowViewOrigin = windowView.frame.origin
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func addPanGesture(view: UIView){
    let pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePan(sender:)))
    view.addGestureRecognizer(pan)
}

@objc func handlePan(sender: UIPanGestureRecognizer){
    let window = sender.view!
    let translation = sender.translation(in: view)

    switch sender.state {
    case .began, .changed :
        windowView.center = CGPoint(x: UIScreen.main.bounds.size.width*0.5, y: window.center.y + translation.y)
        sender.setTranslation(CGPoint.zero, in: view)
        break
    case .ended:
        UIView.animate(withDuration: 0.5) {
            self.topImageView.alpha = 0.0
        }
        break
    default:
        break
    }
}
}

Я надеюсь, что кто-то может помочь мне в правильном направлении, я не знаю, как двигаться дальше с этой точки.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Это звучит как работа для CAShapeLayer в качестве маски на слое вашего верхнего изображения.

(В iOS-представлениях на самом деле используются тонкие обертки вокруг Core Animation Layers, которые выполняют фактическое рисование.

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

Я предлагаю поиск по CAShapeLayer и маске. Есть довольно много уроков онлайн. (Я давно не сталкивался со слоями фигур и масками, и когда я делал это, это было в Objective-C. Я не думаю, что у меня есть какой-нибудь Swift-код, которым я мог бы поделиться.)

0 голосов
/ 28 апреля 2018

Просто идея: создайте два зеленых ImageView, которые будут отображаться сверху и снизу вашего среднего прозрачного окна ViewView, и измените положения / высоты этих двух видов в соответствии с положением вашего WindowView. Таким образом, зеленые представления никогда не будут отображаться под windowView.

...