【问题标题】:CAGradientLayer, not resizing nicely, tearing on rotation SWIFTCAGradientLayer,没有很好地调整大小,旋转时撕裂 SWIFT
【发布时间】:2014-12-18 17:02:00
【问题描述】:

所以我正在开发一个用 Swift 编写的 iOS 应用程序,我遇到了与此完全相同的问题:

CAGradientLayer not resizing nicely.

我将 CAGradientLayer 添加到我的 UIView 并覆盖 willAnimateRotationToInterfaceOrientation 以更新渐变边界。这似乎只在旋转完成后更新,因此您在旋转时会看到原始帧的边界(这会导致用户看到我的应用程序的白色背景)。

这是我的代码:

在 viewDidLoad 中,我有以下代码:

    var color1: UIColor = UIColor(red: CGFloat(0.12), green: CGFloat(0.13), blue: CGFloat(0.70), alpha: CGFloat(1.0))
    var color2: UIColor = UIColor(red: CGFloat(0.00), green: CGFloat(0.59), blue: CGFloat(1.00), alpha: CGFloat(1.0))
    var color3: UIColor = UIColor(red: CGFloat(0.00), green: CGFloat(1.00), blue: CGFloat(1.00), alpha: CGFloat(1.0))

    let gradient : CAGradientLayer = CAGradientLayer()
    let arrayColors: [AnyObject] = [color1.CGColor, color2.CGColor, color3.CGColor]

    gradient.frame = self.view.bounds
    gradient.colors = arrayColors
    view.layer.insertSublayer(gradient, atIndex: 0)

我重写了这个函数:

    override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
        var gradient:CAGradientLayer = self.view.layer.sublayers[0] as CAGradientLayer
        gradient.frame = self.view.bounds
    }

解决方案似乎是这样的:

// GradientView.h

@interface GradientView : UIView

@property (nonatomic, strong, readonly) CAGradientLayer *layer;

@end

// GradientView.m

@implementation GradientView

+ (Class)layerClass {
    return [CAGradientLayer class];
}

@end

但是我很难将这个类转换为 Swift。有人能帮我吗?到目前为止,我有这个:

import Foundation
import UIKit

class GradientView:UIView
{
    var gradientLayer:CAGradientLayer = CAGradientLayer()

    func layerClass() -> CAGradientLayer {
        return gradientLayer.self
    }
}

但它似乎不起作用。我不明白 [CAGradientLayer 类] 中使用的“类”消息的 Swift 等效项是什么?

我已经尝试了几个小时来完成这项工作,但我似乎无法做到。任何帮助将不胜感激!

谢谢

【问题讨论】:

    标签: ios objective-c uiview swift cagradientlayer


    【解决方案1】:

    你需要重写layerClass()类方法,并返回一个类:

    class GradientView: UIView {
        override class func layerClass() -> AnyClass {
            return CAGradientLayer.self
        }
    }
    

    在某些时候,您还需要将gradientLayer 属性设置为self.layer

    【讨论】:

    • 是的,这就是我在上面的示例中提出的内容。
    猜你喜欢
    • 2013-07-07
    • 2018-10-30
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多