В настоящее время я изучаю, как реализовать пользовательские элементы управления. Я неизбежно наткнулся на возможность CALayer, поскольку использование UIImage недостаточно гибко, когда необходимо выполнить сложные анимации.Пользовательский элемент пользовательского интерфейса в Swift: подклассификация CALayer и переопределение drawInContext приводит к пиксельному рисунку
Я хочу использовать UIView как «контейнер» для CALayer, так что его ширина и высота всегда совпадают с UIView (для целей гибкости).
Я подклассифицировал CALayer и переписал метод drawInContext().
Вот результат я получаю на экране:
Чертеж выглядит некачественно и нечетким. Я использую PaintCode для создания кода чертежа для меня.
Вот обычай CALayer:
class SegmentActive: CALayer {
func frameSetup() -> CGRect {
let frameWidth:CGFloat = superlayer.frame.width
let frameHeight:CGFloat = superlayer.frame.height
let frame = CGRectMake(0, 0, frameWidth, frameHeight)
println("\(superlayer.frame.width) // \(superlayer.frame.height)")
return frame
}
override func drawInContext(ctx: CGContext!) {
UIGraphicsPushContext(ctx)
CalorieCalculatorUI.drawSegControlActiveBase(frameSetup())
UIGraphicsPopContext()
}
}
А вот как я использую его:
class ViewController: UIViewController {
@IBOutlet weak var leftSegmentUIView: UIView!
override func viewDidLoad() {
let activeSegment:SegmentActive = SegmentActive()
leftSegmentUIView.layer.addSublayer(activeSegment)
activeSegment.frame = activeSegment.frameSetup()
activeSegment.setNeedsDisplay()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Что я здесь делаю неправильно? :(
Большое спасибо Давиду! Ты абсолютная легенда! Ваши ответы и блоги всегда наполнены знаниями и мудростью. Еще раз - спасибо добрый сэр! –
Действительно. Просто FTR общие, похожие, связанные проблемы: когда вы (скажем) оживляете размер чего-то подобного, вам нужно self.layer.shouldRasterize = YES; – Fattie
Эй, @ JoeBlow, спасибо! Я действительно планирую оживить много вещей, поэтому я уверен, что это пригодится. –