Маскировка UIView в iOS 10

#ios #iphone #swift #cocoa-touch #uiview

#iOS #iPhone #swift #cocoa-touch #uiview

Вопрос:

У меня есть вызываемый UIView подкласс myView и UIViewController вызываемый myViewController .

Я добавляю myView как подкласс внутри myViewController , и я также маскирую myView subview внутри его файла.

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

Кто-нибудь знает почему?

Спасибо!

Мой код:

myViewController :

 override func viewDidLoad() {
     let theView = myView(frame: CGRectZero)
     theView.translatesAutoresizingMaskIntoConstraints = false
     self.view.addSubview(theView)

     theView.bottomAnchor.constraintEqualToAnchor(self.view.bottomAnchor).active = true
     theView.leftAnchor.constraintEqualToAnchor(self.view.leftAnchor).active = true
     theView.rightAnchor.constraintEqualToAnchor(self.view.rightAnchor).active = true
     theView.heightAnchor.constraintEqualToAnchor(self.view.heightAnchor, multiplier: 0.17).active = true
}
  

myView :

 override func layoutSubviews() {

        super.layoutSubviews()
        let ev = UIView(frame: self.bounds)
        ev.backgroundColor = UIColor.blueColor()
        ev.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(ev)

        ev.rightAnchor.constraintEqualToAnchor(self.rightAnchor).active = true
        ev.bottomAnchor.constraintEqualToAnchor(self.bottomAnchor).active = true
        ev.leftAnchor.constraintEqualToAnchor(self.leftAnchor).active = true
        ev.heightAnchor.constraintEqualToAnchor(self.heightAnchor, multiplier: 1.5).active = true

        let myPath: CGPathRef = PocketSVG.pathFromSVGFileNamed("CategoriesBar").takeUnretainedValue() //Creating a CGPath object using a  3rd party API
        var transform: CGAffineTransform = CGAffineTransformMakeScale(self.frame.size.width / 754.0, self.frame.size.height / 220.0) //Resizing it

        let transformedPath: CGPathRef = CGPathCreateMutableCopyByTransformingPath(myPath, amp;transform)! //Creating a re-sized CGPath

        let myShapeLayer = CAShapeLayer()
        myShapeLayer.path = transformedPath
        myShapeLayer.fillRule = kCAFillRuleEvenOdd

        let myMaskedView = UIView(frame: self.frame)
        myMaskedView.backgroundColor = UIColor.blackColor()
        myMaskedView.layer.mask = myShapeLayer
        ev.maskView = myMaskedView //THE PROBLEM. If I remove this line the view is visible (but it isn’t masked), but when I don’t the view just completely disappears!
}
  

Примечание: проблема возникла, когда я обновился до iOS 10, на iOS 9 все в порядке.

Ответ №1:

« self.view.layoutSubviews() viewDidLoad() перед внедрением « UIView сработало для меня. Это как-то связано с изменениями жизненного цикла viewcontroller в iOS10.

Комментарии:

1.Ну, я решал свою проблему около часа, и я понял, что теперь вы должны быть очень осторожны с self.bounds self.frame etc. потому что в моем случае я манипулировал UIView mask, когда его фрейм, который был в порядке в swift 2.3, стал (0, 0, 1000, 1000), поэтому я исправил это с помощьюпечать UIView.bounds , размещение ее в разных функциях и, в конце концов, нашел способ сделать так, чтобы она не была (0, 0, 1000, 1000) ( путем добавления self.view.layoutSubviews() ). Я предполагаю, что ваша проблема аналогична, но я не уверен на 100%.

2. self.bounds : (0.0, 0.0, 375.0, 113.5) self.frame : = (0.0, 553.5, 375.0, 113.5)