Create views for different versions of the iphone - objective-c

I'm creating a project that will run on versions, since the iphone 4 until iPhone 6 We all know that the resolution of the screens are different for each device.
In my case, to get around this I created three files .xib type, and in each one I modified the size of the view in xcode inspector attributes tab to stick with the same size of the devices.
I wonder if this way I'm doing is correct, and if there is no other better?

Of course. You should use AutoLayout.
Check the manual.
How it works at a glance: you just setting different relations between views in Interface Builder. It looks like:

Related

Xcode storyboards and xibs for iPhone and iPad

I currently have an iPhone app thats uses xib's as the graphical interface.
We are planning to make an iPad app using the same code, but with a completely different graphical interface.
I really like storyboards because of the nice flow and overview and was thinking of using it only for the iPad, but I'm also considering not to because:
Is it bad practice to have one for iPad but not for iPhone?
The seque and push/present can probably be confusing?
Having more developers in a storyboard can give merge nightmares?
Thanks in advance
Is it bad practice to have one for iPad but not for iPhone?
If you continue to use only XIBs, do the same for both if its a universal app. It will be confusing for others who may work on your code. And you might end up with a lot of if else code.
The seque and push/present can probably be confusing?
Once you get used to it, its really a useful way of navigating between controllers. If you have any specific questions do point it out.
Having more developers in a storyboard can give merge nightmares?
Its just a XML document, any versioning system out there can handle merges pretty easily. As with any file if two or more developers have worked on same piece of code (in this case can be color change, layout change) then yes it will get conflicted. And developers should be in sync. If one dev is changing the whole structure of the controllers then yes it will be a nightmare. You need to wait and get the latest working copy and ammend your changes.
And you dont have to put all eggs in one basket. You can have multiple storyboards as well.

Different Views for iPhone 4 and 5

I have some CGPoints that need to be different for iPhone 4/4S vs. iPhone 5/5S/5C. How can I display different storyboards based on the iPhone screen size? I have checked some of the other questions, but they aren't quite getting the job done.
You don't need to have two separate Storyboard for the two sizes of the iPhones. There are two ways of achieving this:
Use Auto Layout
Use spring and struts
Without going into details on how to use those, you should be able to specify properties like "How far the view should be from bottom of the screen", etc. You can use those to differentiate the two screens.

How can Xcode 6 adaptive UIs be backwards-compatible with iOS 7 and iOS 6?

I just watched the WWDC video #216, "Building Adaptive UI with UIKit."
At about 45:10 Tony Ricciardi talks about changes to IB in Xcode 6 to support the new changes.
He says "You can deploy these documents backwards to older versions of iOS".
(where "These documents" presumably means XIBs and storyboards that have specific settings for different size classes.)
I'm not making this up. Go watch the WWDC video.
How is that possible? Trait collections and size classes are only defined in iOS 8. How can runtime behavior that's dependent on UI constructs that are new to iOS 8 work in previous iOS versions?
If it is possible it would be wonderful. You could build apps that will run on iOS 6, 7, and 8, and take advantage of the new flexible UI layout abilities that Apple has added to Xcode 6. I've created adaptive UI logic myself in code, and it's quite a bit of work.
Changes made to the UI with Size Classes in Interface Builder DO appear correctly on iOS 7 devices and the Preview in Xcode. For example, I changed some Auto Layout constraints and font sizes for Regular height Regular width and those changed constraints are visible in the iPad Simulator running iOS 7.0.
All size class optimizations are made available to iOS 7, except size classes that have a Compact Height. This has been confirmed by Apple and is now stated directly in the documentation:
For apps supporting versions of iOS earlier than iOS 8, most size classes are backward compatible.
Size classes are backward compatible when:
- The app is built using Xcode version 6 or later
- The deployment target of the app is earlier than iOS 8
- Size classes are specified in a storyboard or xib
- The value of the height component is not compact
Because iOS 7 doesn't respect a couple of size classes, if you use them you'll run into issues. For example:
When you have Compact w Any h defined and then Compact w Compact h defined, on iOS 7 it will respect the Compact w Any h but on iOS 8 it renders the Compact w Compact h appearance.
So, if you would like to utilize those two size classes and maintain compatibility with iOS 7, I would do any optimizations you desire for iPhone in landscape in Any w Any h or Compact w Any h, then perform your other optimizations for different size classes as necessary, and that way you won't need to use any size class with compact height and will avoid running into issues.
When deploying your app to iOS 7, Xcode will compile your storyboard in two different ways:
For iPhone, your storyboard gets compiled as "Compact-Regular" (Compact width, regular height), and this gets packaged as your "~iphone" nib.
For iPad, your storyboard gets compiled as "Regular-Regular" and gets packaged as your "~ipad" nib.
So if you're looking to deploy to both iOS 7 and iOS 8, you should focus your design on the Compact-Any and Regular-Any size classes. That will give you the best experience in terms of matching the UI across deployment targets. You are, of course, welcome to modify the layout for other size classes, but unless those modifications would get applied to the Compact-Regular or Regular-Regular size classes, then you would not see those modifications on iOS 7.
Note: This answer was relevant to a beta version of Xcode 6 and is no longer applicable to the shipping version. See answers by Joey and Dave DeLong on this page for proper information.
(original answer retained below):
While Storyboards/XIBs configured to use size classes will run on iOS 7, the OS does not currently respect those size classes and appears to use the default 'Any/Any' size class.
I agree that the particular slide you are referring to seems to promise such compatibility, but it doesn't appear to be the case currently (Xcode 6 beta 2).
To test, I created a project (iOS 8 SDK, deployment target of 7.1) with a single button that is centered vertically and horizontally in the Any/Any size class, but aligned to the top left corner in the Compact/Compact size class (e.g. iPhone in landscape). Xcode's Preview Assistant shows that the button changes its position in iOS 8, but not iOS 7. I confirmed this behavior on an iOS 7 device as well.
As some of the answers and comments were discussing the nature of backwards-compatibility, I thought I would share an excerpt direct from the Apple Documentation:
~~~~~
Deploying an App With Size Classes on Earlier iOS Versions
For apps supporting versions of iOS earlier than iOS 8, most size classes are backward compatible.
Size classes are backward compatible when:
The app is built using Xcode version 6 or later
The deployment target of the app is earlier than iOS 8
Size classes are specified in a storyboard or xib
The value of the height component is not compact
~~~~~
That last bullet point is targeted at this discussion, where Apple confirms that as long as "compact height" is not used, it should maintain backwards-compatibility.
Hope this helps someone!
While dealing with the similar issue I found another answer that I haven't seen here yet. Looks like Size Classes in XIB files are not working at all. If I create cell prototype in the storyboard file it works in iOS7 as explained in other answers, however when the same prototype cell is moved into separate XIB file - size classes are ignored in iOS7.
Here is link to the sample project demonstrating this behavior: https://dl.dropboxusercontent.com/u/6402890/testSizeClasses.zip
In the prototype cell I have four constraints from each edge of the grey view. Each of the is configured in a same way: Any/Any - 10, Regular/Regular - 20
It works fine in iOS8 simulator for both XIB and Storyboard, and in iOS7 only cells defined in Storyboard gets updated constraints on iPad:
If it saves anyone time, I believe that the way Xcode 6 provides quasi-backwards compatibility for size classes is via the historical ~ipad and ~iphone suffixed storyboards, and nothing more. This makes sense since size classes are a more abstracted way of how we previously defined an iPad storyboard, and an iPhone storyboard.
Therefore:
If your goal is to use size classes to support device family specific layouts (iPad vs. iPhone), then you are in luck: size classes are a nicer interface to the previously supported method.
If your goal is to use size classes to support altered layouts for different models within the same device family - ie. iPhone 5/6/6+ inc. landscape, then you are out of luck. Using these would require a minimum iOS 8 deployment target.
#lducool - In interface builder, in the Identity inspector, change 'Builds For' to iOS7.1 and later.
Unfortunately the answers from Dave and Joey do not work for me.
I am not allowed to comment in this thread, so please forgive me if this is the wrong place.
I have made up a specific question for that:
Example for iPhone portrait landscape adaptive UI which is backwards-compatible with iOS 7
From what I learned so far, I believe now that, like in my example, is is not possible to have 2 separate, different constraints for one ui element in portrait and landscape mode with iPhone iOS7 based on size classes.
Would be glad if I am mistaken, though.

Creating views for iOS 6

I was wondering if someone could explain to me how to create views that work for both for iPhone 5 and prior models. I have done my research and have found people suggesting the use of
setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight
But I have the following questions regarding this.
If I am building in interface builder and plan on using the above line of code, do I leave the size option at "Retina 4 Full Screen"?
Will the above line of code account for images that were previously set at a specific location on 3.5 inch screens?
Is there a generic place I can put this line of code in my app so it does it for all views or do I need to put it in each viewController and within ViewDidLoad?
Thanks in advance!
If you are planning to deploy app only on iOS6, then you can use autolayout option.
If you are targeting iOS 6.0 and previous version then you can use view resizing with autoresizingMask. One other approach you can use is that it can be to design separate views for iPhone 5 and iPhone 4S. Check screensize and load views accordingly, as in the case of universal apps.
Thanks,
Jim.

Android: render multiple views in a ScrollView

Have a code that renders custom Views and placed on a ScrollView (n by n) with dynamic width per view.
I've been having sluggish performance when running it in Tablet 10.1 but seems ok in Tablet 7.0.
Would there be any improvements if I replaced Views with SurfaceView?
Or would a single SurfaceView with mapped cell work instead? I've found this sample project but using this as a guide for the current code seems.. difficult, what with different widths on custom views and the resolution on other devices.
Any other suggestions?
It depends on the hardware but if you are running on the emulator, it's not accurate. If you are using real devices, try to avoid using custom a lot of custom views because it will be sluggish in a scrollview. Try at least to use standard widgets and move the "custom" parts to another view, it's the simplest, most accesible, and easier to code solution to your problem.
A listview calling another activity would be the fastest and most user friendly approach IMHO.