Ios Widget Development


How to start working with us.

Geolance is a marketplace for remote freelancers who are looking for freelance work from clients around the world.


Create an account.

Simply sign up on our website and get started finding the perfect project or posting your own request!


Fill in the forms with information about you.

Let us know what type of professional you're looking for, your budget, deadline, and any other requirements you may have!


Choose a professional or post your own request.

Browse through our online directory of professionals and find someone who matches your needs perfectly, or post your own request if you don't see anything that fits!

Upon examining the widgets, you can see a structure timeline Provider type TimelineEntry with two functions: preview snapshot and times. Let'sLet'sack to that later. There is also a structure, SimpleEntry, of types Timeline Entry with date properties. It's the structure of information displayed within the widget. The second view consists of a placeholder view and a static widget gallery entry view. These are views that appear within your widget creation on your screen.

Designing the widget view

I want to begin by introducing the process of designing a stock market widget, taking into account that I've created two widgets. Initially, you will need to develop the information you want to display in your medium size widget. Also, keep in mind that iOS has unique requirements for view design. Therefore, always use XCode for these designs, even if your final product is not an iOS application.

Once you have decided what type of view best suits your needs, it's to create widgets in XCode. There are six steps to follow here: 1. Import images/icons which you intend to display within the view 2. Add labels or other views where necessary 3. Open Data View inside the assistant editor menu 4. Create the outlet from the view to your view controller, and name it appropriately 5. Create action from another view or a button, name it accordingly to what will be done when that item is tapped 6. In this case, you also need a segue that tells your application how to transition from one screen to another

We'reWe'reance, and we help you create beautiful widgets for your website. Our widgets are easy to use and customizable. You can add them to any page on your site with a few lines of code.

With Geolance, you can build powerful widgets that display information from anywhere on the web in real-time. It doesn't matter if it's feed or some other API endpoint; our platform will handle all of the heavy liftings for you! All you need is a little bit of HTML knowledge, and we'll care about the rest.

If this sounds like something that would be useful to your business, then sign up today! We offer free trials, so there's involved in trying out our service before committing fully to it. Then, once everything is set up, copy/paste some code into your website and watch as new data flows into your widget within seconds!

I'll you through each step so that we can recreate the views created by Apple for their Siri widget.

For the Product Name, I used "Widget" manager" for "this example, then clicked Next. When prompted with options, check to Use Automatic Reference Counting and uncheck Use Storyboard, Then click Next. It will help if you know we're on the screen where you name your first File as ViewController. Once you have named it, click the Next button again.

Name your class file as Main View Controller and then click Next on the next screen. You can now choose where to save your xcode project. Since we're a widget, I recommend using Widgets within your Documents folder.

For example, I will create a new folder called Navigation-SiriWidgets inside documents. Now that our files have been created let's out what we want from our widgets. In this case, I'll with AppleApple'sult objects for simplicity reasons. I also tested most of what you will be learning in the simulator, so if something shows different on an iPhone or an iPad, please let me know, and we can troubleshoot it.

The first step is to create the segue, which is the action that tells the system how to move from one screen to another with a push of a button or tap of a view. Since I want my widget to depend on what you do at the main application level, I created this segue manually. This allows us to set up our modal view controller for transition purposes. The following picture shows what your Main View Controller and Navigation Controller should look like at this point:

This brings us to create our custom view controller with its standard three UIViews: Modal View, Static Widget Entry View, and Place Holder Template View Let'sLet'ste those now. First, we need to create the entry view, the central view for our widget. I've created a couple of these, as you can see from my previous article.

Here'Here's what I want mine to look like: The first thing we need to do is import images and fonts we intend to use in this custom entry controller. For simplicity, I am using AppleApple'st-in images and font applications: UIImage, SystemFontOfSize, and UIFont, respectively.

To show you how to set up your outlets and actions, open the ViewController.m file in XCode Next, control+drag from your Modal View Controller onto ViewController to create an IBOutlet Make sure that under Destination dropdown, it says modal view controller and leave the other settings as default. To create an action, control+drag from your staticEntryButtons into View Controller. This time set Destination to Static Entry Button, then click Connect.

Please give it a name that makes sense to you, such as staticEntryButtonPressed. Now, we need to control-drag from our Func Placeholder Template View onto ViewController. Hence, it creates an IBOutlet Make sure that under the Destination dropdown, it says placeHolderTemplateView and set the other options as below:

Now let's actions for this using this same procedure (control+drag), but this time, we will be setting Destination to Place Holder Template Subview and giving them names accordingly. You can now build and run the application to see the UIViews you just created

You should be seeing something like this: Now, let's some additional images in our assets folder for dynamic elements. First, on your main view controller layout file (ViewController.Hib), add two images to the default set of views using this image set:

The first will be used for our title and needs to be named "Widget" manager title" The "second will be used when our view is plain without any text or graphics and needs to be named "widget" t-entry-bg" the" save it Also take note that if you do not have a default set of views in your central view controller, select widget extension with the right button at the top left corner of the view and select Add Missing Constraints from the menu that pops up.

If you have been following this tutorial, then your ViewController layout file should look something like this:

We will get back to this later on, but let's build our Navigation Controller scene for now. In XCode, select File > New > File so we can add a new Objective-C class of UIViewController subclass called CustomWidgetsNavigation Scene.m Since we want our navigation controller to depend on the widgets selected on the main screen, I recommend using a tab bar controller instead of a standard navigation controller. This gives us two scenes with two separate custom views keeping everything neat and orderly.

How can I modify Widgets according to requirements?

In native mobile apps, it is necessary to modify widgets according to our requirements. For example, I know that I will be converting my decimal values into Fahrenheit or Celsius based on the user's app settings. To do this, I am going to use a UISwitch object.

You can see from the screenshot above that each switch has two possible options: On and Off. Also, observe that when one switch is ON, its companion is OFF. This allows us to represent our decimal numbers as either Fahrenheit or Celsius, which are represented by Switch 1 and Switch two, respectively The next step is straightforward: Drag and drop each button onto the view controller Scene using Auto Layout, so we get something like this: We want them centred horizontally and bottom aligned to the baseline of the two labels. Also, make sure that you change them to look like switches (with a white circle and line). Now, let's go back to ViewController.m because we need to update it with IBOutlet properties for each switch. We will give our views names accordingly so they are easy to recognize when coding your iOS app.

I named mine: Switch 1 (Fahrenheit): _fahrenheitSwitch1 Switch 2 (Celsius): _celsiusSwitch2 Creating Action Methods in XCode Finally, let's use Action methods in XCode for each switch in our code view controller. Since these buttons will start new activities or segues depending on which one is chosen, we will use them to create an action method name accordingly.

We will call the one for Celsius as _celsiusSwitch2Pressed. Similarly, if we want Fahrenheit, then it is _fahrenheitSwitch1Pressed To connect these buttons with our code, control+drag each of them to ViewController.h and choose their respective action methods We'llWe'll get this one: _celsiusSwitch2Pressed Now that everything is done let's how it looks like in XCode. Depending on which you prefer, you can now run your app on a simulator or an actual device. Remember that you cannot debug Apps directly on iOS devices, so you'd need at least two devices for testing. Conclusion In this tutorial, I showed you how to turn a standard first Widget into an iOS app with native views using custom layouts. We can quickly create apps for our iOS devices with widgets without writing a single line of code plus; it is straightforward to distribute your Apps on the Apple App Store.

The most exciting part was creating a view controller scene and adding custom labels and switches, which can do a lot more than simply changing colours or labels as widget data changes. For example, if you want to convert some temperature from Celsius into Fahrenheit, you have to use two UISwitch objects and update those values according to those settings. Depending on your preferences, you can even choose different themes, such as light ones or dark ones.

How can I add widget extensions to my app?

Widget extensions allow your users to customize some of the look and feel of your app. A new widget extension can provide a layout as an interface and some code that runs when your app's view displays it. Many widget families are available on the iPhone, such as currency converters, unit converters, games, etc. Third-party developers may provide a widget extension target distributed through the App Store and installed on iOS devices using XCode or iTunes. Extensions must first be enabled before they will appear in the Today view. For example, let's we want to add a currency converter to our list of widgets:

To do this, go to ViewController.m. Also, create outlets properties for each switch and action methods to update our labels accordingly. For example, we will call the one for Celsius as _celsiusSwitch2Pressed, and similarly, if we want Fahrenheit, then it is _fahrenheitSwitch1Pressed In ViewController.m, create the following code:

We connect each switch with their respective action method using control+drag from the switch to the view controller. H and calling them according to your preference. Finally, you can run your app on a simulator or an actual device, depending on which you prefer. Remember that you cannot debug Apps directly on iOS devices, so you'd need at least two devices for testing. For more information about creating Widget Extensions, check out AppleApple'smentation.

Defining your widget in the widget editor

As you can see, XCode has something called "Widget" t Editor" whi "h allows you to choose your widgets and then drag them into your app. If you right-click each switch in the Objects Library tab of Widget Editor, select "Add "o Document," an" then drag it into your story board's controller, they will look like this: Note that there are two RadioButtons for Celsius and Fahrenheit since we want to use both simultaneously. Also, note that when creating your custom layouts, follow AppleApple'sn Interface Guidelines (HIG) because these are what users expect when using an iOS device. It is also recommended that views with text should not be taller than 44 points; otherwise, it might get cut off in some places. I hope you enjoyed this tutorial. Please subscribe, follow me on Twitter, or subscribe to my YouTube channel for more iOS related videos such as how to add swipe gestures to search in your app or adding soft keyboard support, etc.

Widgets on Android vs. iOS: A Quick Comparison

I will be doing a series of posts about getting widgets onto the home screen of iOS devices and this is the first one since we'rewe'reg to cover some of the basics and get started with them You can think of widgets like an interactive view that gets displayed using a custom layout (similar to running apps) but different since they are made up of entirely different layouts which look better than regular apps Once these widgets get built you can efficiently distribute them through the App Store (or any third-party store) to millions of people without writing any code or distribution You can think of widgets like an interactive view that gets displayed using a custom layout (similar to running apps) but different since they are made up of entirely different layouts which look better than regular apps Once these widgets get built you can efficiently distribute them through the App Store (or any third-party store) to millions of people without writing any code or distributing them in-house Let'sLet'st by opening XCode, go to File -> New Project and select Widget Application under iOS -> User Interfaces Now when you run this application on your iPhone it will be just like regular applications except instead of giving you what Apple calls 'Char's Bar' on 'op you will see a list of all your widgets here If you tap on one of the widgets it will show an edit screen where you can add additional features Take note that when creating custom layouts inside XCode there is no limit in terms of size However when distributing them they must follow AppleApple'sn Interface Guidelines (HIG) which is possible using Widget Static Configuration Parameter File I will be covering this aspect in my next post Hope.

Adding Widget Extensions to iOS Apps

In thIn this post, I will be covering a little bit about widget extensions and how you can integrate them into your iPhone/iPad apps using XCode 5 It has been a while since my last tutorial but now that Apple has released XCode 5 it's time for some new tutorials In this post I will be covering a little bit about widget extensions and how you can integrate them into your iPhone/iPad apps using XCode 5 Let's go ahead and open up XCode from the dock Now if you don't have an existing project, create one by going to File -> New Project Now select Widget Application under iOS -> User Interfaces and click Next After that give it a name and click Finish The first thing we want to do is to link existing widgets on our home screen so that they can be used inside our app It's really easy since all you have to do it just drag and drop them into the 'Widget Catalog' of your project's files Do note that if you rename the widget on your phone, this name will also change here Let's go ahead and search for Speed Dial Widget which is something I'm using right now This will set up everything needed to reference that widget Now let's create a new page with two speed dials One will be Fahrenheit and the other one Celsius You can make as many pages as you want by clicking Add Page For every page we need a Custom Widget title for our app Also make sure not mess up naming conventions otherwise it will throw an error if the class doesn't exist Before we move on, make sure to set up a Custom Class for each page So in our case we will have Speed Dial and Speed Dial C Now since we're building speed dials let's go ahead and drag two images for Fahrenheit and Celsius This way it'll be easy to reference them inside our app Once successfully added check the Widget Catalog from the project files from above Next thing that you need to do is open MainPage.xib from your XCode interface Then under Object Library search view Just as before drag two views onto this main screen by holding control. it all together

Ok, so now that we have everything in place, let's have a look at what we've we've so far. The first-speed dial widget has been added, and you can see the Fahrenheit and Celsius images for reference. The next thing we did was add two views to our main page. Here, we will add our buttons, leading us to either Fahrenheit or Celsius pages. We did the last thing was add two custom classes that refer to our widgets and their respective images.

Widget Configuration File

In XCode 5 if you create a widget extension you might notice a new file with the extension WXWidgetconf This File is used to change configuration settings for widgets like size title color etc It has various options which can be found here Let'sLet'shead and edit our configuration intent file for Fahrenheit Speed Dial Now open up the WXWidgetConf file As you can see there are two configurations defined one is LaunchScreen.png which refers to what image will show on your main screen while launching an app The second one is FahrenheitSpeedDial.png which refers to what image will show on that specific page (Fahrenheit) Now because we'rewe'redoing anything special here let'slet's keep it at default values but do note that this should be edited if you plan on showing an image of your choice Once done, you can go ahead and save this File Ok so now if we compile our app it should work fine on both iPhones and iPads As you can see here the images are being loaded generally without any issues which is great You might have noticed that this speeds dial looks different from the original widget I hate to say but yes this is wrong because these images are not being stretched Another significant issue is that they don'tdon'tanywhere neither do they have animations.

Fixing Background Images

Since our background images look horrible, let's fix them by going back into WXWidgetConf and setting up a new key/value called LaunchScreen.png. Just give it a random image name. Because we'reing this File, this will also change on your phone.

The next thing we want to do is assign a new key/value pair for FahrenheitSpeedDial.png, referring to the image on this specific page. Now, our images don't look as bad, but still, they've stretched, nor do they have animations.

Fixing Images

You need to go into XCode and click on those '+' s'g's near widget Files to fix these images. Make sure that those files are added as Custom Launch Images. This way, when launching the app, it'll take those images properly. Also, select Background Contents: Color Transparent so that nothing blocks your background image from showing up Properly. Once done with all of this, let'slet'sour app. Now our speeds dials look better than ever.

Fixing Tapping Buttons

At the moment you can'tcan'tk these buttons which is because we didn'didn'tthem up yet to respond to taps We'llWe'llhis now by first opening MainPage.xib again Then under Object Library search UIView Drag two of these onto your main screen next to your speed dial views Give each view an identifier for example call one btnFahrenheit and the other btnCelsius Next thing that you need to do is open up AppDelegate.m file If you did everything correctly then your delegate should be looking like this @interface AppDelegate () -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; @end Next we need to put up some code inside that Class which will detect taps on those buttons and then open up a page We'llWe'llsing a notify function for this purpose Let'sLet'shead and make a new function called openFahrenheit Here we will put our custom code to work Now inside this method all you need to do is create an instance of UIAlertView When creating the object make sure to set delegate as self This way when you tap on OK your delegate function that was created earlier will be triggered And once again if you did everything correctly then that should happen.

Making New Classes

Back in AppDelegate.m file, let's another custom class by going under Class, clicking on 'NSOb'ect' and then clicking on the plus button Type in your class name, for example, FahrenheitViewManager, Then make sure to make it a subclass of NSObject Once done with all of this create an instance variable by clicking inside that class body then '+' sign Declare it as an IBOutlet, call it to view manager. Our Objective-C compiler will know that we can connect views to this object.

TimelineReloadPolicy and Re-Synchronize

Now we need to make a new function called reloadTimeline: which will be responsible for resyncing our data and viewing the timeline data. We'llWe'llte this function directly below the openFahrenheit method, And inside it, all you have to do is call refreshTimeline, bypassing the proxy object. So the next thing that's happened is that your app will resync itself whenever it runs out of data or if there are changes. If you did everything correctly, along with the compiler errors so far, you should have something like this. Now don't link up these two objects just as I showed you before, both in the AppDelegate.m file and inside the MainPage.xib file.

Loading Data into Table View

At the moment red box contains no data, which is not suitable for us. That'That'swe needs to create a new class called TimelineController, which will do all of this heavy lifting. When you make a new class, make sure to make it a subclass of UITableViewController You might see compiler errors, but what's important right now. What is essential is these three methods required by UITableViewDataSource First one tells the table view how many cells should show up in our timeline. This can be calculated by simply dividing total items by item width We'llWe'llme that each cell takes up 50 points Now, let's head and fill out those two other required functions. The first function tells our table view which cells should be visible. This is based on the indexPath passed to us as a parameter We'reWe'reg to use this function later when we call reloadTimeline:

The second function tells a table view of what those cells should look like. We'll support two titles, so let's print them and an image and give each cell a unique identifier. This way, we can identify which cell belongs to which photo.

Build and Run

We'veWe've all of the coding stuff for this tutorial, so it's to build and run your app. If everything goes fine, you should see a new refresh button at the top and a new Fahrenheit button that needs some tapping. Make sure to tap on that Refresh button first, Then click on Fahrenheit. You can even do both simultaneously and load data into the table view while refreshing the timeline.

Multiple widgets (widget target bundles)

Now, as long as our app stays in portrait mode, everything should work as expected, But now, let's turn the device into landscape mode. This is where we'll come up with problems. Our FahrenheitViewController will be empty. The problem comes from the fact that UIKit loads views using their class name, creating a new instance for every rotation. Now, I'm going to show you a simple way of solving this issue but know that there are other solutions.

Create a WidgetBundles Inside directory; it creates another folder called com, followed by your bundle identifier. In my case, com.KoenigsKindOfCoders In this folder, create a file and call it whatever you want. Just make sure its name starts with Info. Set Build Action to BundleResource and copy the following lines into the File.

If you did everything correctly, then your Info. The plist File should look like this. Now go back to your storyboard, And under Library, just type Info and UIKit will present you with a list of options. For now, we're interested in BundleConfig because it contains how our widgets should be loaded inside an app. You might notice that Xcode presents us with two ways of doing this Either using object files or folders That'That'swe created those new folders. Before we continue, check Always Embed Unused Icons and Stripes. Otherwise, each time we re-load our storyboards, those icons will also show up. It doesndoesn'ter if you use object files or folders, but for this tutorial, we'rewe'reg to use folders. Now, drag and drop each .xib File into its corresponding folder.

Deep linking

If you've used the Facebook app before, you must have seen this screen.

That'That's linking in action helps make sure custom controls work correctly. First, create a new class called TimelineController, which is a subclass of UITableViewController, Then add another file called DeepLink.cs and make it a subclass of NSObject In our case,e we're to use static classes because we do have an object for testing purposes Here'Here'sthat looks like

Later on, when your user clicks on one of those links, iOS will automatically load TimelineController If all goes well, you should see something like this. Of course, there are other ways to implement deep linking, but I find this method very convenient. Now let's ack to our iOS app. We're to create a new class called DeepLinkHandler The goal of this class will be to handle the deep incoming links. Then, when iOS asks us if we want to open one of those URLs, we say yes and pass it on to TimelineController.

Timeline var entries

Now we need to make sure TimelineController is loading the photos instead of an empty table view ThereThere'sway for us to do this, which creates a new subclass of NSObject called LoadingCell Let'sLet'shead and create it.

Then inside that Class, let's some variables at the top Just like before, we'll sing three images. Let me show you what they look like.

As I said earlier, we're to use those images as backgrounds to replace them with these. Remember, my app is in portrait mode, so I'm showing one image. Still, if your device were in landscape, you'd like all three images. As for the dataSource, we already have our public property, which returns an array of photos. Also, I want to make sure that if a user doesn't have a photo selected, then the one at the top should come up as the default, So I'm going to set all those variables from 0 to 1 just in case.

Now let's head and connect those images. First, let me show you what that looks like. In the storyboard, under Image View, drag from imageView.Image to your custom cell, Then select Loading Cells as its destination ThereThere'seed for methods, so we're to stick with methods, But there is something else we have to take care of, And that would be making sure our app can handle deep links. We already did this earlier, but it might have been confusing since we changed classes. Fortunately, Xcode provides us with a way to test that. If you look at your tab bar, you'll see a Debug button.

Xcode will build your app and run it in the simulator when you click on that. Then, once iOS is finished loading, it will show this screen. If we go back to Xcode and select our TimelineController class, What we have here can happen when an app is initialized. So, let's add a log statement to know what's on Here'Here'sit looks like in Swift.

So once iOS is done doing its thing, then it will try to load TimelineController If all goes well, that should give us the following message And remember, this happens before any of our custom cells shows up, Which means iOS is successfully handling our deep links

nd drop each .xib File into its corresponding folder

Enabling user customization

I'm you know where this is going. We need to create a way for our users to customize their apps. For example, the user might want to change colours or remove some of those photos.

The first thing I want you to do is add an empty file called Assets. Cassettes The name may seem strange, but it's its use. We're to add images that multiple screens will use. This way, iOS has access to the same images, which means they can be customized without having us write code all across the place.

Next, we'll head and add two files - Colors. Swift and Fonts. Silly Let'sLet'st with colours. If you've created Swift en before then, here's it.

We'reWe'recreating an enum called Colors which contains different colours. Our goal is to assign those colours to variables to use later throughout our app. For example, we may want the table cells to have a background colour Let'sLet'st by adding this right below public var dataSource =. Array ( of (PhotoCell.LoadingCell)) remember that I'm coming it loading because there are other custom cells, but let's with loading for now.

Let me show you what that looks like. We do that using dot syntax because enums are classed. To give each enum member a variable name, all you need to do is type: followed by your variable name. Then inside our loop, all I did was replace colour. black with a table cell.backgroundColor = Colors. dark

You might be wondering why I'm sI'ming it too dark but remember that our cells are in portrait mode. I also want the cell-cell's size to be larger. While we're, let's another enum. Remember, enums are easy when you have different items to be grouped. You can set their values by typing .blue or. Light green But because colours are so important, let's me they use dot syntax. At this point, it should look something like this public var dataSource = [PhotoCell.LoadingCell] private var default colors : Colors = [ PhotoCell.LoadingCell.colors, PhotoCellLightBackgroundColor ] private var photoCell = PhotoCell () private var photoTableView = UITableView()

WidgetKit and WKInterfaceObjects

You might wonder why I'm creating a new variable and its use to create objects using JavaScript Object Notation. Ik, as you know, is iOS' way of interfacing with widgets. Of course, we all learned this in our iOS programming courses, but most people do not understand that WKInterfaceObjects are just as crucial as UIKit objects.

Here'Here'sxample Let'sLet'st by adding another file - InterfaceController. Swift This will serve as our link between Objective-C and Xcode. Now, it should look like the following public class InterfaceController: WKInterfaceController { } Remember earlier when I said enums are great for grouping together different items? Well, interfaces are pretty much the same thing, except instead of having enums with values, you have objects that contain properties. The property is simply a variable or an expression that holds essential information. If you're with Objective-C, this idea should look familiar to you. of course, most programmers are familiar with UIView, which has numerous subclasses, including UIButton and UILabel. Still, WKInterfaceObjects can be reused throughout your project.

Let'sLet'shead and create our first Class - PhotosListItem. Swift Before we start programming anything, let me show you what it looks like You'lYou'llce 3 things: 1) It's of InterfaceController 2) Its parent is interfaced controller, 3) Its base class is NSObject This tells us where the location of the File is within your project and its parent in case you have a file that belongs to a different class.

This will serve as our base class for all of our custom widgets. This is the only helpful subclass from NSObject, so let's public class PhotosListItem: NSObject { } Now, we can add properties Let'sLet'st by specifying photos collection, which is simply an array In Swift, arrays are used for holding a collection of items that belong to the same type Here, we're to put all of our data into one array and then use that data source throughout all of ClassyPhotos And while we're, let's another property called count.

Remember earlier when I said WKInterface Table will loop through all of your items? Well, this is why I'm creating one Now the only thing left to do is add .count to our loop public override init () { super.init () // Setup TARGET_INTERFACE_CONTROLLER = "InterfaceController" // 1 - Setup NSNotificationCenter TARGET_INTERFACE_CONTROLLER.addObserver (self, selector: "photosLoaded", name: UIPhotosLoadedNotification, object : nil) // 2 - Create data source for table tableView.dataSource = self } private func loadPhotos() { var path="" let request=NSURLRequest(URL: NSURL(string: path)) NSOperationQueue.mainQueue().addOperationWithBlock({ self.photosCollection = try! DataRequest.fetchPhotos (fromUrlRequest: request) { [unowned self] photos in // 3 - Setup Notification Center let center = NSNotificationCenter.defaultCenter() center.postNotificationName(UIPhotosLoadedNotification, object : nil) }) } }

TableView versus CollectionView

Remember earlier when I said UICollectionView is used for lists of data? An Object Library can contain both Table Views and Collection Views. A table view displays cells vertically, while a collection view displays them horizontally. They are pretty much the same thing, except that one is meant to be used with lists while the other is meant to show different kinds of data in a grid-like format.

Geolance is an on-demand staffing platform

We're a new kind of staffing platform that simplifies the process for professionals to find work. No more tedious job boards, we've done all the hard work for you.

Geolance is a search engine that combines the power of machine learning with human input to make finding information easier.

© Copyright 2022 Geolance. All rights reserved.