2016-06-10 64 views
1

我已經在所有模擬器上測試過以下代碼,並且它在iPad Pro上除外。在iPad Pro上不顯示。梯度層將正常工作,只有當我嘗試和應用,它不會對iPad Pro的模擬器出現口罩:iPad Pro模擬器不顯示layer.mask

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 
} 
} 

由於

格雷格

+0

你在哪裏調用'createOverlay()'? – luk2302

+0

我添加了這個類,所以你可以看到它是如何被調用的 –

+0

我面臨着同樣的問題。目前我將其縮小到50%,然後圖形顯示正確。 – CopperCash

回答

0

我面臨同樣的問題。 目前我

  • 開啓調試 - >優化渲染窗口縮放
  • 比例縮小到50%

然後圖形顯示正確。

但我的一所大學告訴我他必須關閉ORWS選項。有線。

相關問題