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

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!

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:

How to handle Asynchronous images and video when adding image as SubView?

I have a collection view where I add either an image or a video depending on the kind of media in a Media() object.
What I am unsure about is how I could use something like SDWebbImage when adding the video or image as a SubView instead of adding it to a UIImage view.
if postArray[indexPath.item].media[0].imageURLString != nil { //its an image
print("display image")
var imageView = UIImageView(image: postArray[indexPath.item].media[0].imageURLString!)
imageView.frame = CGRect(x: 0, y: 0, width: 126, height: 203)//cell.frame
cell.imageOrVideoView//Here I need to add image
//.addSubview(imageView)//Here I would usualy add a UIImage to subview
I have also asked this question regarding the same general topic.
First: you shouldn't add subviews inside cellForItemAt as the cell is dequeud and this will overflow the content and mix them unless you clear it before reuse , but you need to create an outlet or imageView once as an instance var then use it
Second: it's better to have a separete cell for image and another for video
Finally: use SDWebImage for images and VGPlayer for videos

How to add a fixed bar on the mapView on 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

iOS - Location of a TextField created programmatically

I have a doubt: it is wrong to create a TextField from the code and not from interface builder?
For example, I am using 'AwsomeTextField' taken by CocoaPods.
In the pages of explanation says:
let field = AwsomeTextField(frame: CGRect(x: 60, y: 200, width: 320, height: 44))
field.placeholder = "test"
view.addSubview(field)
But if I assign an absolute position with CGRect (x: 60, y: 200, width: 320, height: 44) then if I run the app on an iPad or an iPhone IF of course the graphics becomes atrocious.
I can use the modules of cocoa pod from interface builder to add the right constraints, or can I work on autolayout also by code? I'm confused!
There is nothing to stop you adding constraints to a view created in code:
let field = AwsomeTextField(frame: .zero) // Create the view with a zero frame
field.placeholder = "test"
field.translatesAutoresizingMaskIntoConstraints = false // You should always do this to views you create in code that you want to apply layout constraints to
view.addSubview(field)
// No that you have added field as a subview, you can add constraints to it here.
If you want to use Interface Builder, drag a plain UIView from the picker onto your view controller and add any constraints. Then, set the class of the view from UIView to AwesomeTextField
'AwsomeTextField' Pod is an extension of a UITextField.
Drag a UITextField object in interface builder, make an outlet and switch the outlet type to AwesomeTextField like that:
#IBOutlet weak var awesomeTextField: AwsomeTextField!
also include AwsomeTextField class in Custom Class section of the Identity Inspector in xCode.
This way you don't need to create it from code all the time ;]

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