Jump to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
  • Status: Fixed
  • Priority: Critical
  • Resolution: Fixed
  • Platform: iOS
  • Affects version 1.18.11.0
  • Fix version: 1.18.12.0

Всё началось с того, что клиенты стали жаловаться, что на старых айфонах ( 7, 8 ) приложение падает.

Нашли для тестов iPhone 6 c IOS 15.7.9 и воспроизвели данную ошибку.

На современных версиях IOS (16-18) всё работает нормально. Ниже какой версии IOS проявляется данная ошибка сказать затрудняюсь.

Падает на строке AboutCollectionView.Realign; Если данную строку закомментировать, то всё работает.

Project18.zip

User Feedback

Recommended Comments

  • Administrators

Какая задача решается вызовом AboutCollectionView.Realign из события TfgForm.OnShow?

  • Administrators
  • На ARM симуляторе iOS 15.5 не удалось воспроизвести.
  • На iPhone 6 (iOS 12.5.7) не удалось воспроизвести так же.
  • На iPhone 15 Pro Max (iOS 18.3.2) не удалось воспроизвести.
  • На iPad 7G (iOS 16.1) - удалось воспроизвести
  • Administrators

В старых версия iOS был баг связанный с нулевым размером UICollectionView при старте, который используется в реализации TfgCollectionView. Смысл такой этой баги, если у списка нулевой размер, то это приводило к падению в старых версиях. В вашем случае, это не явно, вы вызываете Realign из события TfgForm.OnCreate для формы, которая еще не отображена на экране и не проинициализирована полностью для отображения. Что в целом является не правильным. Даже не смотря на то, что свойства у компонентов имеют не нулевые размеры, не означает, что нативные компоненты имеют такие же размеры в OnCreate. Так как нативные представления синхронизируются и получают актуальные состояния уже в OnShow.

В результате, представление вкладки TfgPage получает нулевой размер с дальнейшим выравниванием списка TfgCollectionView. Как итог приложение падает.

Решение:

  1. Если очень нужно, заменить вызов Realign на RequestRealign. Этот метод выполняет отложенное выравнивание.
  2. Не использовать выравнивание на этапе создания формы.
  • Administrators

Нашел обходное решение. Однако, все равно, не советую вызывать выравнивание до OnShow.

Mineev

Active subscription
9 часов назад, Yaroslav Brovin сказал:

Какая задача решается вызовом AboutCollectionView.Realign из события TfgForm.OnShow?

Изменение размеров и выравнивание компонентов на форме. Это форма из реального проекта. Лишний код просто вычистил. Оставил лишь то, что приводит к ошибке.

Mineev

Active subscription
8 часов назад, Yaroslav Brovin сказал:

вы вызываете Realign из события TfgForm.OnCreate

Я не вызываю Realign в OnCreate!!! Откуда вы это взяли?

7 часов назад, Yaroslav Brovin сказал:

не советую вызывать выравнивание до OnShow

Realign и вызывается именно в OnShow! И приложение падает!

  • Administrators
10 hours ago, Mineev said:

Я не вызываю Realign в OnCreate!!! Откуда вы это взяли?

10 hours ago, Mineev said:

Realign и вызывается именно в OnShow! И приложение падает!

Ваш код раз, событие OnCreate - встраиваете страницу:

procedure TFormMain.fgFormCreate(Sender: TObject);
begin
  try
    var Screen := TAboutScreen.Create(Self{, False, False});
    var Page := ScreensPageControl.AddPage;

    AddFrame(Page, Screen);
  except
    on E: Exception do
//      LogStr('TFormMain.fgFormCreate.%s: «%s»', [E.ClassName, E.Message]);
  end;
end;

Ваш код два, создаете форму и вызываете у нее метод Show:

procedure AddFrame(const AParent: TfgControl; const AFrame: TfgForm; const AFlexGrow: Single = 1);
begin
  AFrame.BeginUpdate;
  try
    AFrame.PositionMode := TfgPositionMode.Relative;
    AFrame.Alignment.FlexGrow := AFlexGrow;
    AFrame.FullScreen := False;
    AFrame.Parent := AParent;
    AFrame.Show;
  finally
    AFrame.EndUpdate;
  end;
end;

Ваш код три - вызов Realign:

procedure TAboutScreen.fgFormShow(Sender: TObject);
begin
  inherited;
  FillAbout;
  AboutCollectionView.Realign;
end;

P.S. Иногда полезно воспользоваться отладчиком.

Mineev

Active subscription

Код встраивания взят из вашего примера. Как в этом случае пользоваться событиями?

  • Administrators
15 hours ago, Mineev said:

Код встраивания взят из вашего примера.

Я тоже вызываю Realign?

15 hours ago, Mineev said:

Как в этом случае пользоваться событиями?

Прочитать мои рекомендации выше о том, чего НЕ СЛЕДУЕТ делать. А так же прочитать "Решение" выше.

Если вы встраиваете форму, то так же можно делегировать решение о вызове Realign родительской форме. Например, в OnShow родительской формы сделать нотификацию вложенных форм. 

В вашем проекте, на текущий момент, вызов Realign несет только вред (даже, если это не привело бы к падению). Потому что работает в холостую на неактуальных размерах и это в свою очередь приводит к задержке открытие главной формы. 

Mineev

Active subscription
8 часов назад, Yaroslav Brovin сказал:

Я тоже вызываю Realign?

Вы вызываете Show из Create! А в событии OnShow вполне логично вызвать Realign!

8 часов назад, Yaroslav Brovin сказал:

Если вы встраиваете форму, то так же можно делегировать решение о вызове Realign родительской форме.

У меня в приложении около 30 таких встроенных форм. Как вы себе представляете это делегирование? Я должен в событии OnShow главной формы управлять размерами и расстановкой элементов на 30 формах?

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.