Everything posted by Yaroslav Brovin
-
1.18.14.0 Русский
Скачать: setup_1.18.14.0_release.rus.zip Дата релиза: 13 августа 2025 Новое ✨TfgCanvasCохранение состоянияПереработан подход к управлению состоянием канвы, а именно методы SaveState / RestoreState. Раньше при сохранении состояния вы получали объект состояния, который в дальнейшем надо было использовать для восстановления в методе RestoreState. Такой подход оказался избыточным, так как команды отрисовки выполняются последовательно и управление состоянием идет тоже последовательно (восстановление до предыдущего состояния). Теперь при сохранении состояния оно автоматически сохраняется во внутреннем стеке состояний канвы. Добавлен новый парный метод RestoreState(), который извлекает последнее состояние из стека и восстанавливает его. Теперь шаблон работы с состоянием канвы выглядит так: ACanvas.SaveState; try // Выполняем отрисовку finally ACanvas.RestoreState; end;Внимание: Теперь нельзя восстанавливать любое состояние, только последнее. Это связано также с принципом работы нативной канвы в Android / iOS, которые не предусматривают такой возможности. Обрезание по путиДобавлена поддержка обрезания области отображения по указанному пути. Новый метод TfgCanvas.ClipPath позволяет добавить к текущей области отсечения новую. Например, отрисовка красного круга обрезанного центральным кругом, вписанным в область TfgPaintBox: procedure TFormMain.fgPaintBoxPaint(Sender: TObject; const ACanvas: TfgCanvas); var CirclePath: TfgPath; begin ACanvas.SaveState; CirclePath := TfgPath.Create(nil); try CirclePath.AddArc(fgPaintBox.LocalBounds, 0, 360) .ClosePath; ACanvas.ClipPath(CirclePath); ACanvas.Fill.Kind := TfgBrushKind.Solid; ACanvas.Fill.Color := TAlphaColorRec.Red; ACanvas.FillCircle(TPointF.Create(0, fgPaintBox.Height / 2), fgPaintBox.Height / 2); finally CirclePath.Free; end; ACanvas.RestoreState;Восстановление области отсечения осуществляется только при помощи восстановления состояния канвы SaveState / RestoreState. Внимание: Данный функционал не поддерживается в дизайнере. Заполнение путейДобавлена возможность управлять способом заполнения путей Canvas.FillPathRule. Детали. Внимание: Данный функционал не поддерживается в дизайнере. Пользовательский штрих StrokeДобавлена возможность использовать пользовательский шаблон штриха в кисти TfgBrushStroke. Задание пользовательского штриха осуществляется при помощи метода: procedure SetCustomDash(const ADash: TDashArray; const AOffset: Single); TfgSvgPathДобавлено новое свойство FillRule (NonZero, EvenOdd). Детали. Дизайнер формыДобавлен новый редактор градиентной кисти. Детали. Провайдер тайлов от Яндекс картДля TfgMap добавлен новый провайдер тайлов от Яндекс карт TfgYandexMapTileProvider. Провайдер тайлов поддерживает кастомизацию внешнего вида в рамках API. Для использования необходимо получить бесплатный API ключ. Подробности по ссылке. Новый сервис IFGXApplicationMetaDataServiceДобавлен новый сервис для получения метаданных приложения. Чтобы прочитать значение переменной с именем `test_value` вы можете использовать код var value: string; value := Application.MetaData.Values['test_value'];Для iOS метаданные хранятся в файле info.plist, для Android в манифесте AndroidManifest.xml в тегах meta-data. Перетаскивание контролов (Drag & Drop)Для всех контролов (за исключением некоторых композитных контролов типа TfgDrawerLayout, TfgBottomSheetLayout и т.д.) добавлена возможность перетаскивания на другие контролы по Long Tap. За возможность перетаскивания отвечает свойство DragEnabled. Чтобы узнать, находится ли в настоящее время контрол в состоянии перетаскивания, обратитесь к свойству `IsDragged`. Так же в процессе перетаскивания у контрола возникают события OnDragStarted (в начале) и OnDragFinished (в конце перетаскивания). Для возможности приёма перетаскиваемых контролов добавлено свойство AcceptDropMode. По умолчанию приём перетаскивавых контролов запрещён (TfgAcceptDropMode.Restricted). Однако, вы можете разрешить приём всех контролов (TfgAcceptDropMode.AcceptAll), либо же в рантайм контролировать приём с помощью события OnCanAcceptDrop (режим TfgAcceptDropMode.AcceptByEvent). Основное событие OnDragDrop оповещает о бросании перетаскиваемого контрола на контрол приёмник. OnDragEntered - перетаскиваемый контрол оказался над принимающим контролом, OnDragExited перетаскиваемый контрол покинул пределы принимающего контрола. Событие OnDragOver возникает при перемещении перетаскиваего контрола над принимающим контролом. Типичный пример обработки бросания компонента: procedure TFrameDrop.fgFrameDragDrop(Sender: TObject; const AData: TfgDragObject; const APoint: TPointF); var LTarget: TfgControl; LDragged: TfgControl; begin LTarget := Sender as TfgControl; LDragged := AData.Control as TfgControl; LDragged.Position.SetPointF(APoint - AData.DragPoint); LTarget.InsertControl(LDragged); end;Добавлен новый демонстрационный проект "Перетаскивание" -> "Базовый пример". Улучшения 🙌SVGДобавлена поддержка следующих атрибутов: stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, fill-rule. Связанный вопрос. TfgMapДобавлен новый метод TfgMap.FindVisibleMarkersRegion для определения видимого региона на карте, охватывающего все видимые маркеры на карте. Один из вариантов использования отображения видимого региона всех маркеров: var VisibleMarkerRegion: TfgMapRect; if fgMap1.FindVisibleMarkersRegion(VisibleMarkerRegion) then fgMap1.MoveCameraToVisibleRegion(VisibleMarkerRegion, 20);Добавлен дополнительный параметр Animate в метод MoveCameraToVisibleRegion, позволяющий управлять применением анимации при перемещении камеры. TfgControlДобавлен новый метод TfgControl.LocalTo, предназначенный для конвертации точки в локальной системе координат контрола в систему координат указанного контрола ATo. Android ApiОбновлен заголовочный файл Android.Api.ActivityAndView для типа android.app.ActivityManager. Теперь можно узнать запущенные процессы и потребляемую ими память. РазноеТеперь все окна библиотеки используют темизированный заголовок, как остальные окна IDE. Исправление ошибок 🐛FGX-449 Событие TfgMap.OnTap не работает. FGX-450 Под IOS невозможно убрать все окна маркеров на карте (iOS). Исправлена работа Bluetooth BLE для Delphi 12.2 и ниже. Приложение могло падать при использовании двух экземпляров TfgWebBrowser с инициацией процесса выбора файла на странице. Приложение могло падать при использовании TfgMap в ландшафтной ориентации при изменении зума (iOS). FGX-457 Под IOS не работает TfgMap.CameraZoom (iOS). FGX-458 Примеры с картой не рассчитаны под iOS (iOS). FGX-461 AccessViolation при использовании TfgAppleIdButton (iOS). FGX-462 Баг с отображением TfgArch. Для Android могли не сохраняться параметры на странице "Основные настройки" в настройках проекта.
-
1.18.14.0 English
Download: setup_1.18.14.0_release.eng.zip Release date: 13 August 2025 New ✨TfgCanvasSave stateThe approach to managing the canvas state has been redesigned, namely the SaveState / RestoreState methods. Previously, when saving a state, you received a state object, which later had to be used for restoration in the RestoreState method. This approach turned out to be redundant, since the rendering commands are executed sequentially and the state is also managed sequentially (restoring to the previous state). Now, when a state is saved, it is automatically saved to the canvas internal state stack. Added a new paired method RestoreState(), which retrieves the last state from the stack and restores it. Now the template for working with the canvas state looks like this: ACanvas.SaveState; try // Painting finally ACanvas.RestoreState; end;Warning: Now you can't restore any state, only the last one. This is also due to the principle of how native canvas works in Android/iOS, which do not provide for such a feature. Clip by pathAdded support for cropping the display area along the specified path. The new TfgCanvas.ClipPath method allows you to add a new one to the current clipping area. For example, drawing a red circle clipped by a central circle inscribed in the TfgPaintBox area: procedure TFormMain.fgPaintBoxPaint(Sender: TObject; const ACanvas: TfgCanvas); var CirclePath: TfgPath; begin ACanvas.SaveState; CirclePath := TfgPath.Create(nil); try CirclePath.AddArc(fgPaintBox.LocalBounds, 0, 360) .ClosePath; ACanvas.ClipPath(CirclePath); ACanvas.Fill.Kind := TfgBrushKind.Solid; ACanvas.Fill.Color := TAlphaColorRec.Red; ACanvas.FillCircle(TPointF.Create(0, fgPaintBox.Height / 2), fgPaintBox.Height / 2); finally CirclePath.Free; end; ACanvas.RestoreState; end;The clipping area is restored only by restoring the state of the SaveState / RestoreState canvas. Warning: This functionality is not supported in the designer. Fill path ruleAdded the ability to control the way paths are filled Canvas.FillPathRule. Details. Warning: This functionality is not supported in the designer. Custom stroke dashAdded the ability to use a custom stroke template in the TfgBrushStroke brush. The user stroke is set using the method: procedure SetCustomDash(const ADash: TDashArray; const AOffset: Single); TfgSvgPathThe new property FillRule (NonZero, EvenOdd) was added. Details. Form designerThe new designer was added for gradient brush. Details. New service IFGXApplicationMetaDataServiceAdded a new service for getting application metadata. To read the value of a variable named test_value you can use the code var value: string; value := Application.MetaData.Values['test_value'];For iOS metadata is stored in the info.plist file, for Android in the AndroidManifest.xml manifest in the meta-data tags. Yandex Maps Tile ProviderA new Yandex Maps tile provider TfgYandexMapTileProvider has been added for TfgMap. The tile provider supports appearance customization within the API. To use, you need to get a free API key. Details at link. Drag & DropFor all controls (except for some composite controls like TfgDrawerLayout, TfgBottomSheetLayout, etc.), the ability to drag onto other controls using Long Tap has been added. The DragEnabled property is responsible for the ability to drag. To find out whether a control is currently in the dragging state, refer to the IsDragged property. Also, during the dragging process, the control fires the OnDragStarted (at the beginning) and OnDragFinished (at the end of dragging) events. The AcceptDropMode property has been added to be able to accept draggable controls. By default, accepting draggable controls is prohibited (TfgAcceptDropMode.Restricted). However, you can allow acceptance of all controls (TfgAcceptDropMode.AcceptAll), or control acceptance at runtime using the OnCanAcceptDrop event (TfgAcceptDropMode.AcceptByEvent mode). The main event OnDragDrop notifies about dropping the dragged control on the receiving control. OnDragEntered - the dragged control has appeared above the receiving control, OnDragExited - the dragged control has left the receiving control. The OnDragOver event occurs when the dragged control moves over the receiving control. A typical example of handling a component drop: procedure TFrameDrop.fgFrameDragDrop(Sender: TObject; const AData: TfgDragObject; const APoint: TPointF); var LTarget: TfgControl; LDragged: TfgControl; begin LTarget := Sender as TfgControl; LDragged := AData.Control as TfgControl; LDragged.Position.SetPointF(APoint - AData.DragPoint); LTarget.InsertControl(LDragged); end;Added new demo project "Drag and Drop" -> "Basic Example". Improvements 🙌SVGThe supporting followed attributes were added: stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, fill-rule. Related question. TfgMapThe new method TfgMap.FindVisibleMarkersRegion was added for determination visible region on map, which covers all visible markers on the map. One of the ways to use the display of the visible region of all markers: var VisibleMarkerRegion: TfgMapRect; if fgMap1.FindVisibleMarkersRegion(VisibleMarkerRegion) then fgMap1.MoveCameraToVisibleRegion(VisibleMarkerRegion, 20);An additional Animate parameter has been added to the MoveCameraToVisibleRegion method, which allows you to control the application of animation when moving the camera. TfgControlThe new method TfgControl.LocalTo was added. It allows to convert point in local coordinate system of control to the cooridnate system of specified control ATo. Android ApiThe new type android.app.ActivityManager was added to Android.Api.ActivityAndView. Now you can find out the running processes and the memory they consume. MiscellaneousNow all library windows use a themed title like other IDE windows. Bug Fixes 🐛The application could crashed in case of usage 2 instances of TfgWebBrowser with initialized process of picking file on page. The application could crash with TfgMap in landscape orientation and changing zoom (iOS). Fixed Bluetooth BLE operation for Delphi 12.2 and below. FGX-449 the event TfgMap.OnTap doesn't work. FGX-450 It's not possible to hide all markers from map (iOS). FGX-457 TfgMap.CameraZoom doesn't work (iOS). FGX-458 Samples with map is not designed for iOS (iOS). FGX-461 AccessViolation is raised in case of usage TfgAppleIdButton (iOS). FGX-462 Incorrect rendering of TfgArch.Uploading Attachment... For Android, the settings on the "General Settings" page in the project settings might not be saved.
-
При закрытии Delphi практически всегда выпадает ошибка
С большой долей вероятности это исправлено в будущем релизе 1.19.0.0 с добавление поддержки улучшенных тем. В рамках него я сделал ревью кода и нашел несколько важных проблем, которые и исправил там. Релиз 1.19.0.0 планируется выпустить после ближайшего 1.18.14.0 (который будет буквально на днях). Поэтому предлагаю дождаться 1.19.0.0 и дать обратную связь о том, решилась эта проблема или нет. По срокам, 1.19.0.0 в принципе уже давно готов, но там остаются еще не до конца решенные вопросы автоматической миграции старых проектов на поддержку новых тем.
-
При закрытии Delphi практически всегда выпадает ошибка
Changed Status to Open
-
Social network Login
Hello, We support several services for autentication. However, we don't support all service on Android and iOS together. Namely: Biometrics (Android / iOS) Facebook Login (Android / iOS) Google SignIn (Android only) AppleId (iOS only) VKLogin (iOS only) However, We can consider add supporting additional autentication services and their implementation for all platforms, if it's required and can be usefull for other users. Thank you
-
Новые возможности канвы в 1.18.14.0
В этом релизе нет. Но зато улучшили поддержку вашего файла svg, где используются штрихи.
-
Новые возможности канвы в 1.18.14.0
Добрый день, В скором времени выйдет новое крупное обновление 1.18.14.0, в которое войдет новый функционал, который вам однозначно пригодится. В этой статье рассмотрим новые графические возможности по работе с канвой TfgCanvas. Работа с состоянием канвыПеред тем, как мы перейдем к новым возможностям, мы обязаны рассмотреть изменения в работе с состоянием канвы. Поскольку эти изменения необходимы для корректной работы с обрезанием изображений по произвольным кривым. Напомню, что при работе с канвой TfgCanvas разработчик постоянно меняет ее параметры (настройки кисти, матрицы трансформации и т.д.). Поэтому, очень удобно иметь контрольные точки при отрисовке, к которым можно сбросить состояние канвы, чтобы не устанавливать все настройки заново. Для этих целей используются методы SaveState / RestoreState. Метод SaveState возвращал объект состояния, который в дальнейшем нужно было передавать в парный метод RestoreState для восстановления состояния. В новой версии, объект состояния больше не нужно использовать. Было: var State: IFGXSaveState; State := ACanvas.SaveState; try // Задаем параметры отрисовки // Выполняем отрисовку finally ACanvas.RestoreState(State); end;Стало: ACanvas.SaveState; try // Задаем параметры отрисовки // Выполняем отрисовку finally ACanvas.RestoreState; end;Теперь при вызове SaveState, канва автоматически сохраняет состояние во внутренний стек, а при вызове RestoreState извлекает его из стека и восстанавливает. Зачем? Первая причина: Раньше мы сохраняли только параметры кистей, параметры шрифта, режим смешивания цветов и матрицу преобразования. Это было обусловленно тем, что мы в любой момент могли самостоятельно задать любые параметры канвы. Однако, в данном релизе добавлена операция накладывания произвольной области отсечения, которая является не обратимой операцией (это значит, что заданную область отсечения нельзя убрать парным методом). Единственный способ, сбросить или откатить заданную область отсечения - это использовать нативный механизм работы с состоянием канвы. В связи с этим, мы перешли от нашей реализации к нативной, которая НЕ предусматривает восстановление к произвольному состоянию. Вторая причина: Чаще всего при выполнении последовательной отрисовки, восстановление канвы требуется не на произвольное состояние, а именно на предыдущее состояние. { State 1 } ACanvas.SaveState; // Save State 1 { State 2 } try // Задаем параметры отрисовки // Выполняем отрисовку ACanvas.SaveState; // Save State 2 try // Другая вложенная отрисовка finally ACanvas.RestoreState; // Rollback to State 2 end; finally ACanvas.RestoreState; // Rollback to State 1 end;Внимание: Не смотря на то, что старый подход по работе с состоянием сохранился, он может не корректно работать при использовании областей отсечения TfgCanvas.ClipPath. Обрезание по путиОдна из самых интересных графических возможностей - это ограничение области отрисовки на канве произвольной фигурой или путем. Накладывание ограничения выполняется при помощи нового метода TfgCanvas.ClipPath. /// <summary> /// Выполняет накладывание области отсечения будущих команд отрисовки. Чтобы отменить наложенную область ограничения /// необходимо использовать методы <c>SaveState</c> / <c>RestoreState</c>. Перед наложение области сохранить состояние /// канвы, а после завершения работы - восстановить. /// </summary> procedure ClipPath(const APath: TfgPath);Рассмотрим пример, где мы хотим нарисовать два овала красного и синего цветов. Красный обрезать по вписанному овалу в область отрисовки, а синий - не обрезать. Тогда код по отрисовке будет выглядить так: procedure TFormMain.fgPaintBoxPaint(Sender: TObject; const ACanvas: TfgCanvas); var CirclePath: TfgPath; begin // Сохраняем состояние, чтобы в будущем убрать область отсечения ACanvas.SaveState; CirclePath := TfgPath.Create(nil); try // Формируем область отсечения в виде эллипса, вписанного в область отрисовки. CirclePath.AddArc(fgPaintBox.LocalBounds, 0, 360) .ClosePath; ACanvas.ClipPath(CirclePath); // Рисуем красный круг, он будет обрезан ACanvas.Fill.Kind := TfgBrushKind.Solid; ACanvas.Fill.Color := TAlphaColorRec.Red; ACanvas.FillCircle(TPointF.Create(0, fgPaintBox.Height / 2), fgPaintBox.Height / 2); finally CirclePath.Free; end; // Сбрасываем область отсечения ACanvas.RestoreState; // Рисуем синий круг без ограничений ACanvas.Fill.Color := TAlphaColorRec.Blue; ACanvas.FillCircle(TPointF.Create(fgPaintBox.Width, fgPaintBox.Height / 2), fgPaintBox.Height / 2);Где это может пригодиться? Одной из областей применения может стать динамическая отрисовка изображений, обрезанных по произвольной фигуре. Например, вы хотите вывести фотографии или аватарки пользователей в виде круга или какой-нибудь декоративной рамки. Раньше вы могли использовать для этой цели маски. Для этого вам надо было сформировать изображение маски, и затем выполнить отрисовки битмапа с учетом этой маски. Теперь эта операция может выполняться гораздо проще, быстрее и без использования дополнительной памяти. У нас есть изображение, которое мы хотим вывести в круглом варианте и декорировать белым кольцом. Код может выглядить следующим образом. Фотография находится в менеджере ресурсов. procedure TFormMain.fgPaintBox1Paint(Sender: TObject; const ACanvas: TfgCanvas); var PhotoBitmap: TfgBitmap; FramePath: TfgPath; FrameBounds: TRectF; begin // Извлекаем изображение if not TfgAssetsManager.Current.TryGetBitmap(R.Bitmap.PHOTO, PhotoBitmap) then Exit; ACanvas.SaveState; try // Формируем круглую форму рамки и рисуем битмап FramePath := TfgPath.Create(nil); try FrameBounds := fgPaintBox1.LocalBounds; FramePath.AddArc(FrameBounds, 0, 360) .ClosePath; ACanvas.ClipPath(FramePath); ACanvas.DrawBitmap(PhotoBitmap, FrameBounds); finally FramePath.Free; end; finally ACanvas.RestoreState; end; // Декорируем белым кольцом ACanvas.Stroke.Thickness := 10; ACanvas.Stroke.Color := TAlphaColorRec.White; ACanvas.DrawCircle(FrameBounds.CenterPoint, FrameBounds.Width / 2 - 10); end;Заполнение путиЕсть как минимум два способа заливки кривых фигур по пути TfgPath. По умолчанию, в FGX Native использовался способ заливки правой фигуры. Теперь же вы можете выбирать способ заливки и указывать его через свойство TfgCanvas.FillPathRule. Помимо этого, теперь это свойство так же доступно в компоненте TfgSvgPath. Детали о двух способах заливки доступны здесь. Внимание: Данная настройка пока не поддерживается в дизайнере, так как не поддерживается на уровне FMX, которая используется для реализации в дизайнере. Штрихи кистиТеперь вы можете использовать свои варианты штрихов при отрисовки кривых. На уровне кисти TfgStrokeBrush доступен новый вид линии - Dash = Custom. Параметры штриха задаются через новый метод TfgStrokeBrush.SetCustomDash. procedure TfgStrokeBrush.SetCustomDash(const ADash: TDashArray; const AOffset: Single);ADash - это массив парных значений. Первое - это длина штриха, второе - длина пробела. SVGВ этом релизе расширена поддержка параметров SVG, а именно добавлена поддержка следующих атрибутов: stroke-dasharray, stroke-dashoffset, stroke-linecap, stroke-linejoin, fill-rule. Редактор градиентаМы добавили дизайнер для управления параметрами градиента. Новое окно доступно через кнопку, встроенную в свойство типа TfgGradient. Данный дизайнер позволяет, управлять практически всеми параметрами градиента: Добавлять и удалять точки градиента. Чтобы добавить точку, нужно нажать в свободное место на нижнем компоненте с отображением градиента. Чтобы удалить, точку надо утянуть за пределы компонента. Менять тип градиента - линейный или радиальный Менять направление градиента при помощи точек на правой панели просмотра градиента. Сбросить параметры градиента до значений по умолчанию. ИтогВ следующей статье нас ждет обзор новой функции перетаскивания компонентов Drag & Drop.
-
Сделать компонент выбора
-
Scrollbox
В FGX Native нет скроллбокса, который умеет скролить сразу в двух направлениях. TfgScrollBox был введен в первых версиях, однако, из-за того, что он не поддерживал прокрутку в двух направлениях, он был скрыт с палитры компонентов и вместо него введены вертикальный и горизонтальный скроллбоксы.
-
Сделать компонент выбора
Changed Status to Open
-
Баг с отображением TfgArch
Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.18.14.0
-
Баг с отображением TfgArch
Changed Status to Open
-
Баг отображения надписи на кнопке
При использовании шрифта Roboto Medium надпись на тексте не помещается в область, предназначенную для вывода иконки и текста. В результате, в iOS по скольку текст не помещается по высоте, это отображается в таком виде с использованием троеточия. Высота контента кнопки в проекте 20dp. Высота текста с использованием шрифта - 21dp. Достаточно увеличить размер кнопки по высоте, и проблема решится.
-
Баг отображения надписи на кнопке
Changed Status to Open
-
Под IOS не работает TfgMap.CameraZoom
Changed Resolution to Fixed
-
Под IOS не работает TfgMap.CameraZoom
Changed Status to Fixed Changed Fix version to 1.18.14.0
-
Под IOS не работает TfgMap.CameraZoom
Changed Status to Open
-
Combobox Item Confirmation not possible
The initial purpose of OnItemSelected event was extended version of OnChanged event with providing details about selected item. The documentation also points on it: <summary> Triggers when the user has selected another item in the list. In addition, it passes the index of the selected item and the item instance itself. </summary>And we did alot of effort for do it for Android. I agree, that word "Selected" maybe confuse. And it had to have name like OnChangedEx instead. But now we already have what we have. I'm more inclined to believe that the selection should not be called in the same way in iOS if the selection has not been changed. The current situation is as follows: Android triggers this event for any change and for any reason. As a result, there were requests from users that this event not be triggered when it was not needed. And we had to put in a lot of effort to do it. It's easier in iOS, we implement this control ourselves and we have every opportunity to make any behavior. I would not like to trigger this event more often. First of all, because this event is old and it had a different meaning. And changing the logic can make changes to user projects, or force them to edit the code. It would be possible to introduce a separate event that would work the way you want - When the user selects any item, even repeatedly. But the good name onItemSelected is already taken. That's why I'm conflicted. What do you think?
-
AccessViolation при использовании TfgAppleIdButton
Changed Status to Fixed Changed Resolution to Fixed Changed Fix version to 1.18.14.0
-
AccessViolation при использовании TfgAppleIdButton
Changed Status to Open
-
Примеры с картой не рассчитаны под IOS
Changed Resolution to Fixed
-
Примеры с картой не рассчитаны под IOS
Changed Status to Fixed Changed Fix version to 1.18.14.0
-
как узнать высоту статус-бара
Посмотрите, пожалуйста, пример "Форма" -> "Безопасные отступы".
-
Navigationbar title alignment
TfgNavigationBar doesn't support it. However, you can make your own Navbar with usage TfgLayout, couple of TfgLabel and FlexBox.
-
как узнать высоту статус-бара
Используйте событие TfgForm.OnSafeAreaChanged.