iPad Pro Simulator不显示layer.mask

时间:2016-06-10 11:34:46

标签: swift ipad ios-simulator calayer mask

我已经在所有模拟器上测试了以下代码,除了在iPad Pro上工作正常。在iPad Pro上不显示。渐变图层工作正常,只有当我尝试应用一个不会出现在iPad Pro Simulator上的蒙版时:

func createOverlay()
{
    if !(gradientLayer != nil)
    {
        self.gradientLayer = CAGradientLayer()

        self.layer.addSublayer(gradientLayer)
    }
    gradientLayer.frame = self.bounds
    print(gradientLayer.frame)
    gradientLayer.colors = [appColour.CGColor, appColourDark.CGColor]

    //--------FROM HERE ON DOES NOT WORK ON IPAD PRO, NO CRASH BUT LAYER DOES NOT APPEAR
    self.alpha = maskAlpha

    let maskLayer = CAShapeLayer()

    let path = CGPathCreateMutable()

    let rect: CGRect = CGRect(x: xOffset - offset, y: yOffset - offset, width: circleWidth + (offset * 2), height: circleHeight + (offset * 2))
    let bPath = UIBezierPath(ovalInRect: rect)
    CGPathAddRect(path, nil, CGRectMake(0, 0, self.frame.width, self.frame.height))
    CGPathAddPath(path, nil, bPath.CGPath)

    maskLayer.backgroundColor = UIColor.blackColor().CGColor
    maskLayer.path = path
    maskLayer.fillRule = kCAFillRuleEvenOdd

    self.layer.mask = maskLayer
    self.clipsToBounds = true
}

我希望这只是一个模拟器问题,但如果您在我的代码中看到可能导致问题的内容,请告诉我。

我尝试用普通图层替换渐变图层,但仍然无法显示。

这是完整的代码,它是UIView的自定义子类,是IB中视图控制器设置的顶层:

import UIKit

protocol TipSpeechDelegate
{
    func stopSpeaking()
}

@IBDesignable

class HoleMaskView: UIView
{
var xOffset : CGFloat = 0.0
var yOffset : CGFloat = 0.0

var circleWidth: CGFloat = 0.0
var circleHeight: CGFloat = 0.0

var maskAlpha: CGFloat = 0.9

var offset: CGFloat = 10.0
var inset: CGFloat = 8.0

var tipText: String = ""

var myLabel: UILabel?

var gradientLayer: CAGradientLayer!

var relativeCorner: RelativeCornerType = RelativeCornerType.upperLeftCorner

var delegate: TipSpeechDelegate!


override func layoutSubviews()
{
    super.layoutSubviews()

}


override func drawRect(rect: CGRect)
{        
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(HoleMaskView.handleTap(_:)))
    self.addGestureRecognizer(gestureRecognizer)
}


func drawTipText()
{
    createOverlay()

    let height: CGFloat = self.frame.size.height

    if (self.myLabel != nil)
    {
        myLabel?.removeFromSuperview()
    }
    if (yOffset < height/2)
    {
        self.myLabel = UILabel(frame: CGRect(x: inset, y: (yOffset + circleHeight), width: self.frame.width-(inset*2), height: self.frame.height-(yOffset + circleHeight)))
    }
    else
    {
        self.myLabel = UILabel(frame: CGRect(x: inset, y: 0, width: self.frame.width-(inset*2), height: yOffset))
    }

    self.myLabel?.text = tipText
    self.myLabel?.textColor = UIColor.whiteColor()
    self.myLabel?.font = UIFont(name: "Avenir-Medium", size: 20.0)
    self.myLabel?.textAlignment = .Center
    self.myLabel?.lineBreakMode = .ByWordWrapping
    self.myLabel?.numberOfLines = 0
    self.myLabel?.setNeedsLayout()
    self.addSubview(myLabel!)
}


func updateTipText(text: String, circle: CGRect)
{
    self.tipText = text
    yOffset = circle.origin.y
    xOffset = circle.origin.x
    circleWidth = circle.size.width
    circleHeight = circle.size.height

    self.drawTipText()
}


func tipText(text: String, rFrame: CGRect, inView: UIView) -> Bool
{
    showTipMask()

    let convertedPoint = inView.convertPoint(rFrame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = rFrame.size.width
    circleHeight = rFrame.size.height

    self.drawTipText()

    return true
}


func tipText(text: String, button: UIButton) -> Bool
{
    if button.hidden
    {
        return false
    }

    showTipMask()

    let convertedPoint = button.superview!.convertPoint(button.frame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = button.frame.size.width
    circleHeight = button.frame.size.height

    self.drawTipText()

    return true
}

func tipText(text: String, label: UILabel) -> Bool
{
    if label.hidden
    {
        return false
    }

    showTipMask()

    let convertedPoint = label.superview!.convertPoint(label.frame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = label.frame.size.width
    circleHeight = label.frame.size.height

    self.drawTipText()

    return true
}

func tipText(text: String, textView: UITextView) -> Bool
{
    if textView.hidden
    {
        return false
    }

    showTipMask()

    let convertedPoint = textView.superview!.convertPoint(textView.frame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = textView.frame.size.width
    circleHeight = textView.frame.size.height

    self.drawTipText()

    return true
}



func tipText(text: String) -> Bool
{
    showTipMask()

    self.tipText = text
    yOffset = 0.0
    xOffset = self.frame.size.width/2
    circleWidth = 0.0
    circleHeight = 0.0

    self.drawTipText()

    return true
}


func tipText(text: String, view: UIView) -> Bool
{
    if view.hidden
    {
        return false
    }

    showTipMask()

    let convertedPoint = view.superview!.convertPoint(view.frame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = view.frame.size.width
    circleHeight = view.frame.size.height

    self.drawTipText()

    return true
}


func tipText(text: String, stepper: UIStepper) -> Bool
{
    if stepper.hidden
    {
        return false
    }

    showTipMask()

    let convertedPoint = stepper.superview!.convertPoint(stepper.frame.origin, toView: self)

    self.tipText = text
    yOffset = convertedPoint.y
    xOffset = convertedPoint.x
    circleWidth = stepper.frame.size.width
    circleHeight = stepper.frame.size.height

    self.drawTipText()

    return true
}


func showTipMask()
{
    self.alpha = alphaHide
    self.hidden = false

    UIView.animateWithDuration(0.5, animations:
        {
            self.alpha = alphaShow
        }
    )
}


func handleTap(gestureRecognizer: UIGestureRecognizer)
{
    if delegate != nil
    {
        delegate.stopSpeaking()
    }
    print("tapped internal")

    UIView.animateWithDuration(0.25, delay: 0.0, options: UIViewAnimationOptions.TransitionNone, animations:
        {
            () -> Void in
            self.alpha = alphaHide
        },
                completion:
        {
            (finished: Bool) -> Void in
            self.hidden = true
        }
    )
}


func createOverlay()
{
    if !(gradientLayer != nil)
    {
        self.gradientLayer = CAGradientLayer()

        self.layer.addSublayer(gradientLayer)
    }
    gradientLayer.frame = self.bounds
    print(gradientLayer.frame)
    gradientLayer.colors = [appColour.CGColor, appColourDark.CGColor]

    self.alpha = maskAlpha

    let maskLayer = CAShapeLayer()

    let path = CGPathCreateMutable()

    let rect: CGRect = CGRect(x: xOffset - offset, y: yOffset - offset, width: circleWidth + (offset * 2), height: circleHeight + (offset * 2))
    let bPath = UIBezierPath(ovalInRect: rect)
    CGPathAddRect(path, nil, CGRectMake(0, 0, self.frame.width, self.frame.height))
    CGPathAddPath(path, nil, bPath.CGPath)

    maskLayer.backgroundColor = UIColor.blackColor().CGColor
    maskLayer.path = path
    maskLayer.fillRule = kCAFillRuleEvenOdd

    self.layer.mask = maskLayer
    self.clipsToBounds = true
}
}

由于

格雷格

1 个答案:

答案 0 :(得分:0)

我面临同样的问题。 目前我

  • 打开调试 - &gt;优化窗口缩放的渲染
  • 将其缩小至50%

然后图表显示正确。

但我的一所大学告诉我他必须关闭ORWS选项。有线的。