Почему Font.registerFont выдает ошибку при второй загрузке SWF? - PullRequest
1 голос
/ 06 января 2011

Я обнаружил проблему (во flash cs5) при использовании TLFTextfields и шрифтов, используемых во время выполнения, и мне было интересно, есть ли у кого-нибудь решение.

Вот сценарий.

  • Fonts.swf: библиотека для шрифтов (время выполнения расшарил DF4)
  • Popup.swf: всплывающее окно с TLFTextfield (с текстом в нем), используя шрифт из Fonts.swf
  • Main.swf: Основной SWF с кнопкой, которая загружает и выгружает Popup.swf (используя Loader или SafeLoader дает то же самое результаты)

Красиво и просто,

Запустите main.swf, нажмите кнопку и появится всплывающее окно с текстом. Нажмите кнопку еще раз, чтобы удалить всплывающее окно. Все хорошо, теперь нажмите кнопку еще раз, и я получаю следующую ошибку.

ArgumentError: Error #1508: The value specified for argument font is invalid.
at flash.text::Font$/registerFont()
at Popup_fla::MainTimeline()[Popup_fla.MainTimeline::MainTimeline:12]

Я предполагаю, что это происходит, потому что шрифт уже зарегистрирован (проверяется при нажатии перед загрузкой).

Кто-нибудь знает, как пройти через это?

Если вам интересно, вот мой Main.as

package
{
    import fl.controls.Button;

    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.MouseEvent;
    import flash.events.UncaughtErrorEvent;
    import flash.net.URLRequest;
    import flash.text.Font;

    public class Main extends Sprite
    {
        public var testPopupBtn:Button;
        protected var loader:Loader;


        public function Main()
        {
            trace("Main.Main()");
            testPopupBtn.label = "open";
            testPopupBtn.addEventListener(MouseEvent.CLICK, testClickHandler);

        }

        protected function testClickHandler(event:MouseEvent):void
        {
            trace("Main.testClickHandler(event)");
            if(loader)
            {
                testPopupBtn.label = "open";
                this.removeChild(loader);
                //loader.unloadAndStop();
                loader = null;
            }else{
                testPopupBtn.label = "close";
                trace("Registered Fonts -->");
                var fonts:Array =  Font.enumerateFonts(false);
                for each (var font:Font in fonts) {
                    trace("\t",font.fontName, font.fontStyle, font.fontType);

                }
                trace("<--");

                loader = new Loader();
                loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
                this.addChild(loader);
                try{
                    loader.load(new URLRequest("Popup.swf"));
                }catch(e:*){
                    trace(e);
                }

            }
        }

        private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
        {
            trace("Main.uncaughtErrorHandler(event)", event);
        }

    }
}

1 Ответ

1 голос
/ 07 января 2011

Чтобы избавиться от этой проблемы, вы можете добавить пустой и / или невидимый TLFTextField, встраивая загружаемый шрифт, в сцену в кадре 1 вашего Main.fla.В библиотеке он может ссылаться на тот же Font.swf, который вы использовали ранее, но шрифт должен быть указан в основном мувиклипе.Удалите шрифт из библиотеки popup.fla и проигнорируйте предупреждение об экспорте.

Другим способом было бы загрузить (не динамически связывать) Font.swf в основной файл и зарегистрировать шрифт, вызвав Font вручную.registerFont (myFont).

В любом случае, встраивание шрифта во всплывающее окно приводит к вашей ошибке, но загрузка его без встроенных шрифтов и регистрация их в Main.fla сделают свое дело.

...