Images, Icons, and Fonts

Last modified: December 13, 2023

1 Introduction

When building a native mobile application, you may want to use vector images for icons or other illustrations. To achieve this, you can use Scalable Vector Graphics (SVGs). For information on using SVGs with Mendix, see the Integrating SVGs into Native Apps section below.

Want your app to reflect your brand’s design even more? By adding a custom font to your native app, you can ensure your app looks and feels unique. See the instructions in the Adding Custom Fonts to Native Apps section below for information on adding custom fonts to your native app.

2 Integrating SVGs into Native Apps

2.1 Optimizing SVGs

When exporting an SVG from an editor, you will often produce an SVG with several unnecessary elements. These elements increase file size, decrease performance, and can cause unwanted side effects. Therefore it is recommended that you run your SVG through an SVG-optimization tool.

To optimize your SVGs, you can either run them through an online tool such as SVGOMG or use a local tool such as SVGO.

2.2 Unsupported Elements

SVGs can contain several kinds of elements. However, not all of them are supported in native mobile apps. Unsupported elements will have no effect and should be removed. The following SVG elements are not supported for native mobile apps:

  • Complex gradients
  • Animations
  • Video
  • JavaScript code
  • CDATA elements
  • <style /> tags and style attributes (please use regular properties instead)

Mendix suggests manually removing these elements from your SVGs, or using the tools mentioned in Optimizing SVGs above to ensure their compatibility.

2.3 Styling SVGs

You might want to change certain colors in your SVG, for example when adding an image. Mendix allows you to do this by setting the fill and stroke properties in image’s styling. These properties will then be applied to all the elements inside the SVG that do not have these properties.

Take the following SVG as an example:

1
2
3
<svg viewBox="0 0 100 100">
    <rect x="10" y="10" width="80" height="80" stroke="blue"/>
</svg>

Setting the fill property on this image’s styling will turn the rectangle (rect element) to the color provided. Setting the stroke property will result in no changes, since the stroke has already been set.

Here is how an SVG without the fill property looks:

before

Here is how an SVG with the fill property looks:

after

You can check the list of allowed style properties at the react-native-svg repository.

2.3.1 Coloring SVG Icons

Icons can only be set for buttons and bottom bar items. When you integrate an SVG icon into a button or bottom bar item, you will have to set the SVG’s color yourself. When using an app which employs Atlas UI, by default the colors are all white. For more information on styling, see the Native Mobile Styling Guide.

For example, the following code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
export const DemoButton = {
	container: {
		backgroundColor: 'green'
	},
	caption: {
		color: 'orange'
	},
	icon: {
		color: 'blue'
	}
}

Would produce the following button and SVG:

blue svg

2.4 Using SVGs in Pluggable Native Widgets

To use an SVG in a pluggable native widget’s image property, Mendix recommends using the provided Image or Icon component. This will allow a static image of any supported format to be used within your pluggable widget, including SVGs.

Here is an example of using the Image component:

1
2
3
4
5
6
import { createElement } from "react";
import { Image } from "mendix/components/native/Image";

export const PluggableWidget = () => (
    <Image source="PUT_SOURCE_HERE" style={{ fill: 'blue' }} />
);

Here is an example of using the Icon component:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import { createElement } from "react";
import { Icon } from "mendix/components/native/Icon";

export const PluggableWidget = () => (
    <Icon 
        icon={{
            type: "image",
            iconUrl: "PUT_SOURCE_HERE"
        }}
        size={20}
        color="blue"
    />
);

If you want to use SVG elements directly in your pluggable widget, see the react-native-svg library.

3 Adding Custom Fonts to Native Apps

Good typography plays a major role in conveying your app’s message while reinforcing your company’s brand identity. Setting up the fonts you need is as simple as dragging and dropping the required fonts and setting your app’s style. As you can see in the Prerequisites section below, Mendix offers two ways for you to add custom fonts: using the Mendix Native Mobile Builder or manually.

3.1 Introduction to Fonts in Mendix Native Mobile Apps

When it comes to fonts files, several standards and types are common. True Type (.ttf), Open Type (.otf or .ttf), and Web Open Font Format (.woff) are the most common.

The .woff file type does not work with native mobile apps. As this document focuses on native mobile platforms only, you should not use this file type in your apps.

Open Type fonts support a variety of metadata as also the possibility to package multiple font varieties in a single file. This feature is not supported for mobile platforms. You should have each variety of the Font Family you would like to add as a separate file.

Android and iOS each take a different approach to fonts. Where Android requires an explicit declaration for each font added, iOS can derive the font type and font style dynamically. Adding fonts to each platform requires a different approach. Android expects font files to exist in a specific folder, while iOS requires the font files to be explicitly linked in its build process.

Furthermore, both platforms resolve available fonts differently. While iOS fully supports Open Type fonts and can select fonts based on their metadata, Android requires explicit linking of the font file to the weight and style.

React Native, the underlying framework of Mendix native mobile apps, unifies the process of adding fonts. For example, fonts added under assets/fonts on Android are explicitly linked in the app. These fonts are then exposed directly in the framework for styling your widgets using the common CSS properties you use routinely.

There are limitations to mobile font capabilities. For example, Android supports a very limited set of font types: regular, bold, italic, and bold italic.

What does that mean for your app’s style file?

For example, what would happen if you were to use the following snippet in your style file:

1
2
3
{ 
    fontWeight: 550
}

Your font, when running app on Android, would end up looking regular instead of the semi-bold font you would expect. This is because Android would first look up the available font styles registered. Unable to resolve the weight, it would fall back to the next best option. The same applies to styles.

In addition, Android expects the font filename to be a combination of the actual font family name, weight, and style. For example for Time New Roman bold italic, it expects something like TimeNewRoman_bold_italic.ttf. Failing to comply with these naming conventions makes the fontFamily, fontWeight, and fontStyle attributes fail to style text correctly.

So how can these issues be mitigated? First of all, explicitly styling text using the ReactNative equivalent of the CSS text attributes fontWeight and fontStyle should be avoided. The results will vary per platform. Instead, use postscript names. Specifically, instead of a single fontFamily attribute with multiple weights and styles, a font family needs to be defined per weight and style combination.

For example, instead of writing this:

1
2
3
4
export const bold = {
    fontFamily: "Times New Roman",
    fontWeight: "bold" | "500"
}

Define a constant like this:

1
2
3
4
5
6
export const timesNewRomanFontFamily = {
    regular: "TimesNewRomanPSMT",
    boldItalic: "TimesNewRomanPS-BoldItalicMT",
    bold: "TimesNewRomanPS-BoldMT",
    italic: "TimesNewRomanPS-ItalicMT",
};

Then define the styles as follows:

1
2
3
export const boldText = { 
    fontFamily: timesNewRomanFontFamily.bold,
}

Now wherever you use boldText, you will get the expected result on both platforms consistently.

3.2 Prerequisites

Before starting this guide, make sure you have completed the following prerequisites:

Before adding fonts using the Mendix Native Mobile Builder:

  • Run through the Native Mobile Builder’s wizard at least once

Before adding fonts manually:

  • Understand the native mobile local build process
  • Locally check out your repository
  • Understand Git and have a Git tool installed
  • Have XCode installed for the iOS sections below

3.3 Adding Custom Fonts With the Mendix Native Mobile Builder

The Mendix Native Mobile Builder simplifies adding custom fonts to your app. It configures both Android and iOS app and also provides the snippets needed to simply copy and paste in your Mendix app’s native styles. To add custom fonts to your app, follow these steps:

  1. Start the Mendix Native Mobile Builder:

    Start Native Builder
  2. Navigate to Custom Fonts:

    Custom fonts screen
  3. Drag and drop the font files you would like to apply. For example, Times New Roman is being used here. When the process is complete you should see the font family uploaded in the list:

    Custom fonts screen filled
  4. Extend the list using the arrow to the right. Verify the expected fonts are available. You can continue by adding as many fonts as you prefer:

    Custom fonts screen filled and extended
  5. Click the snippet button to get the code snippet which you can copy to your styles:

    Custom fonts screen code snippet
  6. Build your app to get a new binary with fonts included.

3.4 Using Custom Fonts in Your App

To use the new fonts to style your content, follow these instructions:

  1. Copy the snippet from the Native Mobile Builder:

    Custom fonts screen code snippet
  2. Open your styles js file and paste the snippet there. For this example, the custom-variables.js file is being used. For more information on styling your app, see Native Styling:

    Custom variables file
  3. The constant can now be imported and used to define the font family of any test style. Elements styled using these classes will now be styled using the font:

    Custom style

3.5 Adding Custom Fonts Manually

While the Mendix Native Mobile Builder simplifies adding fonts, you might find yourself in a situation where you must add fonts manually instead.

3.5.1 Adding Custom Fonts to an Android App

To manually add custom fonts to your Android app, follow these instructions:

  1. Collect all the fonts you would like to use.

  2. Use a tool like Open Type Inspector and derive the PostScript names for each font:

    Open Type Inspector name metadata
  3. Rename the fonts to match the Postscript name. The Times New Roman font used in our example has these options:

    • TimesNewRomanPSMT, for regular
    • TimesNewRomanPS-BoldMT, for bold
  4. Copy the renamed fonts to the android\app\src\main\assets\fonts folder.

  5. If you plan on using the tool to build your app, commit your changes:

    GitHub repo after uploading cutom fonts
  6. Build your Android app using your preferred method.

Congratulations, you have learned how to add fonts to an Android app.

3.5.2 Adding Custom Fonts to an iOS App

Use XCode to manually add fonts to an iOS app:

  1. Collect all the fonts you would like to use.

  2. Use a tool like Open Type Inspector and derive the PostScript names for each font:

    Open Type Inspector name metadata
  3. Rename the fonts to match the Postscript name. The Times New Roman font used in our example has these options:

    • TimesNewRomanPSMT, for regular
    • TimesNewRomanPS-BoldMT, for bold
  4. Open XCode and select the workspace at ios\NativeTemplate.xcworkspace.

  5. Drag the renamed fonts into the Resources/Fonts folder in App Explorer.

  6. Select both targets from the dialog box that shows up:

    XCode option dialog for adding files
  7. Your folder structure should look like this:

    App Explorer with fonts
  8. Open the Info.plist file by pressing {⌘} + {Shift} + {0}` and searching for the file. Press {Enter} to open it:

    XCode Open file dialog
  9. Find the key Fonts provided by the application. Expand it if needed:

    Plist fonts key
  10. Press the + button next to the key to create a new, empty item in the list.

  11. Type the font file name you wish to add as the value. In this case, we are adding the regular Times New Roman font, therefore the filename value is TimesNewRomanPSMT.ttf:

    Plist fonts key filled
  12. If you plan on using the tool to build your app, commit your changes:

    GitHub repo after uploading cutom fonts
  13. Build your iOS app with your preferred method.

Congratulations, you have learned how to add fonts to an iOS app.