Включить взаимодействие с пользователем в режиме наложения - PullRequest
0 голосов
/ 14 марта 2019

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

func addFullScreenDarkOverlay(){
    let viewDarkOverlay = UIView()
    viewDarkOverlay.alpha = 0.5
    viewDarkOverlay.backgroundColor = .black
    viewDarkOverlay.frame = UIApplication.shared.keyWindow!.frame

    //  add dummy hole (will change it to the frame of the particular cell)
    let holeFrame = CGRect(x: 0, y: 0, width: viewDarkOverlay.frame.width/2, height: viewDarkOverlay.frame.height/2)

    // Do any additional setup after loading the view.
    let path = CGMutablePath()
    // Dark background
    path.addRect(CGRect(x: 0, y: 0, width: viewDarkOverlay.frame.width, height: viewDarkOverlay.frame.height))
    // White/spotlight path
    path.addRect(holeFrame)

    let maskLayer = CAShapeLayer()
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.path = path;
    maskLayer.fillRule = kCAFillRuleEvenOdd

    viewDarkOverlay.layer.mask = maskLayer
    viewDarkOverlay.clipsToBounds = true


    UIApplication.shared.keyWindow!.addSubview(viewDarkOverlay)


}

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

По сути, вы можете отключить взаимодействие с пользователем в представлении маски, которое будет передавать все сенсорные события представлению ниже ... однако, если вы просто хотите, чтобы выделенная область была трудноразрешимой (то есть ячейка), выВы можете создать собственный подкласс UIView, переопределить метод hitTest, например, так:

import UIKit

class MaskView: UIView {

    var hitableArea: CGRect {
        return CGRect(x: 0, y: 0, width: bounds.width * 0.5, height: bounds.height * 0.5)
    }

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

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

    private func installMaskLayer() {

        backgroundColor = UIColor.black.withAlphaComponent(0.5)

        let path = CGMutablePath()
        // Dark background
        path.addRect(bounds)
        // White/spotlight path
        path.addRect(hitableArea)

        let maskLayer = CAShapeLayer()
        maskLayer.backgroundColor = UIColor.black.cgColor
        maskLayer.path = path;
        maskLayer.fillRule = CAShapeLayerFillRule.evenOdd

        layer.mask = maskLayer
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if (!self.isUserInteractionEnabled || self.isHidden || self.alpha <= 0.01) {
            return nil;
        }

        if (hitableArea.contains(point)) {
            return nil
        }

        return self
    }
}

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

0 голосов
/ 14 марта 2019

Удалите взаимодействие с пользователем в представлении наложения, и вы сможете выбрать строки в представлении под ним:

viewDarkOverlay.isUserInteractionEnabled = false

Если вы хотите, чтобы выделение находилось только внутри целого, вы можете перенести касание с наложенного вида на родительский вид с помощью делегата, например, так:

protocol OverlaySelection: class{
    func selected(with touch: UITouch?)
}

class OverlayView: UIView{
    weak var delegate : OverlaySelection?

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        delegate?.selected(with: touches.first)
    }
}

затем в родительском представлении:

func addFullScreenDarkOverlay(){
     let viewDarkOverlay = OverlayView()
     viewDarkOverlay.delegate = self
    //other config..
 }

 //Delegate
func selected(with touch: UITouch?) {
   if let location = touch?.location(in: self.view){
 //Here you check if this point is inside the whole and if it is you select 
 //the row, if not just return
  let indexpath = tableview.indexPathForRow(at: location)
  tableview.selectRow(at: indexpath, animated: true, scrollPosition: .bottom)
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...