A general problem with starting a new project in a new language is that most of the times you are missing the libraries, classes etc. you feel comfortable with.
Same happens with making the switch from Objective-C to Swift.
But there is a solution that is called “bridging header”, that brings Objective-C into Swift.
Using it , its not that complicated.
- create a .h file in your project, e.g. projectname-bridging-header.h
- open the Build Settings in your project targets and search for “bridging“
- add your filename (here: projectname-bridging-header.h) to the “Objective-C Bridging Header” including the path the file can be found (e.g. projectname/projectname-bridging-header.h)
- open your projectname-bridging-header.h and add your import lines as you would do in a normal Objective-C header (e.g. #import “foo.h”)
Now you can access and use the new available classes in the Swift way.
Starting with objective-c for iOS is a big step, when you come from the always dynamic “web”-world with HTML and CSS. Just put content in some HTML Tag and it normally grows with the length of it.
With objective-c and iOS a lot things are just different, like the elements you can choose to put content in, or the way navigation works.
One common problem – especially for beginners – is to accept that you have to calculate sizes for elements programmatically, e.g. UILabel.
When we use the interface builder, there are controls for that, but this is all static so far, e.g. “Lines”.
So how can i resize the UILabel if i do not know the content length?
It is not as complicated as it seems in the first place.
If you use the Interface Builder and put a UILabel in your layout it is important to set “Lines” to 0. i often forgot this, so i think its guess is a common mistake, this is why i point it out 😉
Now we fill the UILabel (here: publicTransport) with a value from a NSDictionary and resize it to the necessary size.
publicTransport.text = [addresslist valueForKey:@"public"];
NSString *message = [addresslist valueForKey:@"public"];
CGSize maximumLabelSize = CGSizeMake(280,1000);
// use font information from the UILabel to calculate the size
CGSize expectedLabelSize = [message sizeWithFont:publicTransport.font constrainedToSize:maximumLabelSize lineBreakMode:NSLineBreakByWordWrapping];
// create a frame that is filled with the UILabel frame data
CGRect newFrame = publicTransport.frame;
// resizing the frame to calculated size
newFrame.size.height = expectedLabelSize.height;
// put calculated frame into UILabel frame
publicTransport.frame = newFrame;
Just copy this code and paste it into your project. Replace the label name publicTransport with the label name you need to resize and this should all work fine 😉