2016-06-10 3 views
1

Я тестировал следующий код на всех тренажерах, и он отлично работает, за исключением iPad Pro. На iPad Pro не отображается. Градиентный слой будет работать нормально, это только тогда, когда я пытаюсь применить маску, что он не будет отображаться на IPad Pro Simulator:iPad Pro Simulator не отображает 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

Я сталкиваясь с той же проблемой. В настоящее время я

  • включите Debug -> Оптимизация рендеринга для масштабирования окна
  • масштаб его до 50%

то график отображается правильно.

Но один из моих колледжей сказал мне, что он должен отключить опцию ORWS. Проводной доступ.