How to add a fixed bar on the mapView on iOS - ios

Recently, I have made a simple project which needs to use GoogleMap Api.
I think that my Question is so simple and easy,
but i don't know how to complete it.
Well this is my problem
i want to add a just simple bar on the View.(up 1, bottom 1)
these 2 bars are fixed. and also there is a button(like moving back button) on the bars that i can presse
Except 2 bar position, if i drag/swipe on mapView than change and show the location information.
please check the following image.(This is what i want to make.)
How can i put the bars on the view and let the bars can be seen in the simulator? plz let me know
(i dont upload code cuz it's not the problem about the code, just want to know about the concept of how to insert view(or layer?) like that)

First, let say you have a map view:
let camera = GMSCameraPosition.camera(withLatitude: 11.5449, longitude: 104.8922, zoom: 12)
let map = GMSMapView.map(withFrame: .zero, camera: camera)
map.isMyLocationEnabled = true
self.view = map
Then, you can just add your top and bottom views to the view as normal
let topBar = UIView()
view.addSubview(topBar)
let bottomBar = UIView()
view.addSubview(bottomBar)
And if you want to add other views such as texts and buttons, you can add them as subviews to the topBar or bottomBar view
let button = UIButton()
topBar.addSubview(button)
Noted: to put the views in the exact locations as in the image, you need to specify their locations.
For example:
bottomBar.frame = CGRect(x: 0, y: view.bounds.height - 200, width: view.bounds.width, height: 200)
In storyboard:
I didn't use google maps so here I'm using the default MKMapView as an example.
First, let's say we have a map view covering the entire view controller:
Then for the top bar, let's add a view and give it some constraints:
Now for the back button and the title:
Now, for the bottom bar: first we need a view to hold all the things:
For the texts, we use 4 uilabels, embed them into a stack to make them lined-up. Give some spacing as well to make them look good:
Finally, for the image on the right, we can use uiimageview or uibutton:
Don't forget to add constraints to the stackview and the uiimageview/uibutton

Related

how to change size of customView passed as UICalanderView Decoration?

I could not find much detail about how to add a customView as decoration for UICalenderView. There are many blogs telling how to add images but could not find anyone about CustomView. In images, we can return the decoration item with size parameter however in case of customView there is no option to pass size along with customView that you are adding. So in the end, I was able to add a view with red background, but the size is wrong. I tried to create a view and give it frame but it had no effect. So im confused how to adjust its size. Here is the method in which I add customView that im creating:
func calendarView(_ calendarView: UICalendarView, decorationFor dateComponents: DateComponents) -> UICalendarView.Decoration? {
return .customView(addActivityCircle)
}
And this is my addActivityCircle method which for now just creating a view with red background color:
private func addActivityCircle() -> UIView {
let view = UIView()
view.backgroundColor = .red
view.clipsToBounds = false
view.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
return view
}
When I run this code I do see a view with red color but it's like a small rectangle, not 50x50. If I pass small values like 20x20, I do see a small rectangle but anything above that I see a rectangle of fixed size. I think that's the limit of decoration item but in apps like Fitness app by apple, there are bigger activity rings than that so there should be a way to have bigger sized custom views as this is just too small. The width is fine but the height is just too less. This is what im getting and it does not get any higher than that:

Custom Markers View in Google Map displacing view inside it in Swift

I have made a xib file of marker (Custom Marker), and assigning that xib file to marker.icon property. This xib file have superView and image inside it, But when it renders on Google Map, image inside SuperView displaces from the bottom as shown in attached image.
And it is happening when I give Google Map View bottom constraints from superView of the ViewController. From safeArea, it is working fine. I have tried in iPhoneX.
Assigning Xib file to Google Marker.
marker.iconView = createMarker(projectIndex: i)
Preparing marker method:
private func createMarker(projectIndex: Int) -> UIView {
let marker = MapMarker(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
marker.updateMarker(project: projects[projectIndex])
marker.tag = projectIndex
marker.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(onTapMarker)))
return marker
}
Below is Marker xib file.
I have spent hours on it but unable to find the bug, Please help me solve this. Thanks!

Unable to Add UI elements on top of AGSMapView

I have an app that I'm trying to migrate from Google Maps to ArcGIS maps because I need to use the maps offline.
I'm using the ArcGIS iOS 100.6 SDK and am trying to place a UIbutton on top of AGSMapView. In the View Controller "MapView" and the UIButton are under "View". The UIbutton is not a subview of MapView. I also have three other elements that should overlay the map that I hide and unhide using "isHidden = true/false" and these cannot be displayed either. The app is written in Swift 4.2 and I'm using Xcode 10.3.
Here is the view in the view controller:
View
Safe Area
Btn Satellite Toggle (outlet name: "btnSatelliteToggle")
View Mark Location
View Verify Location
View Pic Detail
MapView
Constraints
This is the code where I show the map and try to add the button on top:
let viewMap = AGSMapView(frame: .zero)
viewMap.map = AGSMap(basemapType: .navigationVector,
latitude: currentLocation.latitude, longitude: currentLocation.longitude,
levelOfDetail: zoomLevel)
viewMap.graphicsOverlays.add(overlay)
viewMap.touchDelegate = self
view = viewMap
view.bringSubviewToFront(btnSatelliteToggle)
The map is displayed along with the graphics overlay, but I am unable to show any UI elements on top of the map. This works fine with Google maps, but not with ArcGIS maps.
How do I get these UI elements to be displayed on top of the AGSMapView generated map?
Thanks in advance for your help.
It appears your MapView is at the top of the view hierarchy and thus obscuring its sibling views.
Try rearranging the view hierarchy to place the MapView at the bottom:
View
Safe Area
MapView
Btn Satellite Toggle (outlet name: "btnSatelliteToggle")
View Mark Location
View Verify Location
View Pic Detail
Constraints
I actually just solved this. Here is the updated code that works:
viewMap.map = AGSMap(basemapType: .navigationVector,
latitude: currentLocation.latitude, longitude: currentLocation.longitude,
levelOfDetail: zoomLevel)
viewMap.graphicsOverlays.add(overlay)
viewMap.touchDelegate = self
I removed:
Setting AGSMapView(frame: .zero)
as this prevented the map from being displayed in MapView.
Also, by not setting a view (thus using the default view controller "view") all siblings are available for display and can be controlled via "isHidden."

Using MultipleView controller in Container view

I am building an iOS app which have its many different views and difficult also.
I have a tab bar with 4 pages that are as under
Account
Main Page
Wallet
My Lists
when User will tap on List (4th num option), my app needs to show a Header with segmented control (or any top bar like control not decided yet) I want to move Multiple ViewController here . let say top bar has 5 buttons as under
Home list
Relative list
Friends list
office list
clients list
For these different list I have made different View controller. that I want to move in the My List (which is Main view controller and will be deal as a Master view controller and will contain above mentioned 5 buttons) In this Master view controller when I click Home list or Friends list button it will move related View controller just below this top bar (button list)
For more clarification see the picture below. And just let me know How can I do this. . How can I make specific area to be taken by child View controller.
Well I think you are a little confuse in using Container view using IB or by programmatically. when You use in IB , you have to simple create a related class for it. Just like You create View Controller by dragging from Object library and associate it with coca touch UIViewController class.
I will suggest to watch this tutorial. its quiet simple and easy to understand.
but the answer of your question is:
Take a UIView just below the top bar as you said in question. You can make it full width and full height however you like. Then create its out let. just like below and use this as
#IBOutlet var viewMain: UIView!
and just move your Child view controller with this
viewMain.addSubview(childViewController)
You are done
If SegmentControl views have same design then you do not need separate ViewControllers for each.
If Each list has totally different UI then there are many ways to do this.
1- Use scrollview,its content width will be Screenwidth * number of views.
Just add all the views in scrollView.
For Example you want to add to two views Here is the code
self.scrollView.contentSize = CGSize(width: UIScreen.main.bounds.size.width * 2, height: self.scrollView.frame.height)
let vc1 = your view controller
vc1.view.frame = CGRect(x: 0, y: 1, width: scrollView.frame.size.width , height: scrollView.frame.size.height)
let vc2 = your second viewcontroller
vc2.view.frame = CGRect(x: UIScreen.main.bounds.size.width, y: 1, width: scrollView.frame.size.width , height: scrollView.frame.size.height)
scrollView.addSubview(vc2.view)
scrollView.addSubview(vc1.view)
Now if you want to change visible view
scrollView.scrollRectToVisible(CGRect(x: UIScreen.main.bounds.size.width * CGFloat(//Position of your view 1 or 2), y: 0.0, width: UIScreen.main.bounds.size.width, height: scrollView.frame.size.height), animated: true)
2- Use Containers
3- There are very good open source libraries(pods) available as well.One one them is CarbonKit
https://github.com/ermalkaleci/CarbonKit

How do I create a new View (or subView) with the tap of a button in swift?

I am currently making a flashcard app, and I am trying to make a button that creates an entirely new View (or subView) for the user to edit. Should I use Container Views? Collection Views? I also want to have these set to only one View Controller, so I can save the "cards" in one "set". Please Help!!
Edit: How can I save these views in a "folder" so the user can look at them later. Is there an efficient way to do this so the app doesn't slow or stop.
Edit #2: Ok, so I'm kind of getting it... collection views. But how would I implement this into my because I am using tvOS. Any thoughts?
If you want to create a new UIView programmatically, it's actually quite simple. You could create a method like this:
func addNewView(to container: UIView) {
let newView = UIView()
container.addSubview(newView)
newView.backgroundColor = UIColor.blue
newView.frame = CGRect(x: 10, y: 50, width: 200, height: 250)
}
That would create a new view inside whichever container view you passed in with a blue background, 10pts from the left (x-axis), 50pts from the top (y-axis, think a normal cartesian coordinate system with the y-axis inverted), width of 200 and height of 250.
You could then call this method on the push of a button by handling a button tap with it's own method like this:
func buttonTapped(_ sender: UIButton) {
addNewView(to: self.view)
}
Obviously all the values for the frame I gave you were just for an example so you could visualize it in your head, you can edit those however you want, or make calculations based on the size of your device's screen. You can get the device's screen size by saying self.view.bounds

Resources