Есть ли способ получить shadowPath для текста UILabel? - PullRequest
3 голосов
/ 04 октября 2011

В настоящее время я использую UILabel для отображения текста.Я использую CALayer, чтобы придать ему хорошую тень.Но: производительность действительно плохая, когда я позиционирую (и перемещаю) множество элементов UILabel на экране.

В нескольких блогах я читал, что установка shadowPath CALayer оптимизирует производительность, я сделал снимок с закругленным прямоугольником, и он действительно работает.Итак, теперь я пытаюсь выяснить, как получить shadowPath для текста на UILabel.

Кто-нибудь, у кого есть идея?В противном случае мне придется визуализировать мой текст в coregraphics.

Вот пример с shadowPath на прямоугольном слое:

        backgroundImage.layer.shadowOffset = CGSizeMake(0, 0);
        backgroundImage.layer.shadowRadius = LIST_TITLE_VIEW_SHADOW_SIZE;
        backgroundImage.layer.shadowOpacity = LIST_TITLE_VIEW_SHADOW_OPACITY;
        backgroundImage.layer.shadowPath = [UIBezierPath bezierPathWithRect:backgroundImage.bounds].CGPath;

1 Ответ

3 голосов
/ 05 июля 2012

Я нашел решение, которое работает для меня как шарм. Просто создайте изображение с метки, как в этом примере:

            UILabel employeeName = new UILabel(new RectangleF(7, 49, this.View.Bounds.Width, 50));
            employeeName.Text = "David Johnson";
            employeeName.Font = UIFont.SystemFontOfSize(23);
            employeeName.BackgroundColor = UIColor.Clear;
            employeeName.TextColor = UIColor.White;
            employeeName.Layer.ShadowColor = UIColor.Black.CGColor;
            employeeName.Layer.ShadowOffset = new SizeF(1,1);
            employeeName.Layer.ShadowOpacity = 10;
            employeeName.Layer.ShadowRadius = 0.8f;

            UIGraphics.BeginImageContextWithOptions(employeeName.Bounds.Size, false, 0);
            employeeName.Layer.RenderInContext(UIGraphics.GetCurrentContext());

            UIImageView employeeNameImage = new UIImageView(UIGraphics.GetImageFromCurrentImageContext());
            employeeNameImage.Frame = new RectangleF(7, 49, this.View.Bounds.Width, 50);

            imageView.AddSubview(employeeNameImage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...