Я пытаюсь выяснить, как создать овальный градиент, который не является идеальным кругом. Например, американский футбол/регби/форма глаз вместо круга.Создание овального градиента в форме
На данный момент я создал подкласс CALayer, как показано ниже, который создает круг. Как я могу получить это овальную форму (как упоминалось выше)?
class CircleGradientLayer: CALayer {
var startRadius: CGFloat?
var startCenter: CGPoint?
var endCenter: CGPoint?
var endRadius: CGFloat?
var locations: [CGFloat]?
var colors: [UIColor]?
override func drawInContext(ctx: CGContext) {
super.drawInContext(ctx)
if let colors = self.colors, let locations = self.locations, let startRadius = self.startRadius, let startCenter = self.startCenter, let endCenter = self.endCenter, let endRadius = self.endRadius {
var colorSpace: CGColorSpaceRef?
var components = [CGFloat]()
for i in 0 ..< colors.count {
let colorRef = colors[i].CGColor
let colorComponents = CGColorGetComponents(colorRef)
let numComponents = CGColorGetNumberOfComponents(colorRef)
if colorSpace == nil {
colorSpace = CGColorGetColorSpace(colorRef)
}
for j in 0 ..< numComponents {
let component = colorComponents[j]
components.append(component)
}
}
if let colorSpace = colorSpace {
let gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, locations.count)
CGContextDrawRadialGradient(ctx, gradient, startCenter, startRadius, endCenter, endRadius, CGGradientDrawingOptions.DrawsAfterEndLocation)
}
}
}
}
Вы можете попробовать установить преобразование на уровне (например, 'CGAffineTransformMakeScale (1.5, 1.0)'). Это не очень изменяет сам градиент, просто растягивая слой, но это может быть ОК в зависимости от вашего варианта использования. –
Мы уже используем преобразование, чтобы показать сам вид. Может ли преобразование применяться только к слою? – StuartM
Да. См. Здесь: https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CALayer_class/#//apple_ref/occ/instp/CALayer/transform. Свойство 'transform' на' CALayer' имеет тип 'CATransform3D', но не' CGAffineTransform', поэтому вместо этого вы захотите использовать «CATransform3DMakeScale» и друзей. –