Dynamically create buttons inside of UIView - ios

I currently trying to implement a dropdown menu. The content of this menu is supposed to be several buttons. The amount of the buttons is determined by the size of the struct array carsArray.
The title of the button shall be each structs value name:
for n in 0...carsArray.count - 1 {
button.setTitle(carsArray[n].name, .normal)
}
This menu shall slide in from above. To do this, I created a UIView - how can I dynamically create as many buttons as there are entries to the carsArray inside of the UIView?
Additionally, am I right to assume that with every entry the UIView's size have to adjusted? If so, how to also do this with every entry? Or do I have to create a table view to do so?
Is there another, easier way to create such a dropdown menu? Maybe with already from Apple given classes?

The way this can be achieved is by using a UITableView. To implement the opening and closing of dropdown, you would need to add or remove the cells or animate the height of UITableView. To close, you would make the height as 1 row height and to expand, you would make it maximum height or total number of rows height.
This is the library that I created a few months ago for one of my apps. It uses a UITableView to create the drop down. Have a look at this.
Let me know if you face any problem using this. Would be happy to fix.

Related

Should I choose ViewController or TableViewController?

New to Swift. I am trying to write a recipe-sharing app for fun. One of the features is to let users create a new recipe. On this page, users should be able to give an intro to the recipe to be created, upload an image THEN add a LIST of ingredients dynamically (as we have no idea how many ingredients in total beforehand).
I have created a UIViewController, which includes a UIViewTable, an image view and a "add another ingredient" button. I have created a class for the ingredient. And when the "add" button is pressed, a new "Ingredient" cell will be added to the table. However, I found that adjusting the UIViewTable height dynamically is quite hard.
I want my table to adjust its height according to the number of cells (rows). I haven't found much useful info online.
Or maybe I should've not even used this structure. Instead, just use UITableController (The entire page is a table)? But I got confused that some of the elements (image view, submit a recipe button, recipe-intro textfield etc) will be only created once. Why do I bother making them as prototype cells and add them to my view programmatically?
Thanks in advance!
First of all, welcome to Swift!
You put a few questions together, I will try to answer them one by one. Let's start with the simple stuff.
Don't try to change the height of UITableView based on the number of items. If you want to achieve similar functionality, take a look at UIStackView. Set fixed size for the tableView, ideally with constraints using auto layout.
UITableView is supposed to fill specified space and scroll items inside or show cell on top if there are not enough cells to cover all space.
UITableView is highly optimized to scroll over huge amount of cells as the cells are reused on the background. If you are new to the iOS world, take a look at this function https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse it can save you hours of debugging (I have been there)
UITableView vs UITableController
UITableController can save you a few lines of code, but using UITableView inside of UIViewController can give you more freedom and save you refactoring if your app is likely to change in the future. There is no specific advantage of UITableController
If you want to provide the extra elements (image view, submit button, text field etc), you can use several methods and this is where the UIViewController with your own UITableView comes in handy.
You can put some buttons, like a plus icon or "Done" button into the navigation bar, as the native Calendar app does.
You can put the static content (intro text field, image view) above the table view (visible always). Use constraints to place the static content on the viewController.view and constraint the table view under your static content. The table view will take less space on the view keeping the space for your content.
Insert your static content as a table view header (will scroll out with the content). Search "HeaderView" here on stack overflow to see how to achieve that.
Place your content over the tableView. If your button is small (rounded), you can place it over the tableView, eg. Twitter uses this for a new tween button.
Hope this answer your questions. Cheers!

Create a listing inside of a ScrollView

I am writing a Swift app, and on my main screen I have a long scrollview with several regions of content in it (upcoming events, announcements, and then featured products, and finally some basic info). So it's this really long scroll, and you can swipe down to the bottom.
So visualize 4 boxes, if you will, stacked vertically.
The 3rd box shows featured products. This can be anywhere from 1 to 30 items, depending upon any filters the user has in their settings.
My first try was using a UITableView for region#3 inside of this parent scrollview, but the problem is it only shows the first few items/rows and then the rest you scroll inside the table (which is the default/natural behavior of a table, right?). Unfortunately, the requirement I have is that the inner table can't scroll - it needs to display everything at once and you have to scroll (in the main UIScrollView) to get to the bottom (not scroll inside the inner uitableview scroll). Also, everyone seems to say don't use UITableView inside of a scroll.
So how do I create some sort of list where I create one template (like how you would in a xib/tablecell, and then assign a data source to it, and then repeat down without scrolling? Should I use a tableview after all, and just make the height of it very high and turn scrolling off?
Do I somehow instantiate xibs in a for loop and assign them dynamically to some view?
Thanks so much!
Sounds like you want a Table View with Grouped style. That would make it fairly easy to keep your "4 boxes" segregated, and your "3rd box" would simply be 1 to 30 rows in that section.
On note: you don't want to have a "very tall" table view - or any other type of view, for that matter. You want to allow iOS to manage memory for you, and to load and display only those parts of your content that is visible at any one time.
In other words, use a table view like its designed to be used :)

Accordion for UIView and SubViews in Swift 3

I'm trying to build an accordion style ( expand/collapse ) list in IOS/Swift 3. Was confused on which approach to follow like a static UITableView ( since my sub divisions have different types of Ui Controls in the cells ie some have checkbox ,spinner, textview etc. with labels to show configure a list of different Valves) , UIView with nested UIViews sections with an option to clip views . But both have been messed up with without any success.
Illustration
http://imgur.com/a/Bs9SF
Below are the links I followed
https://github.com/justinmfischer/SwiftyAccordionCells
http://www.appcoda.com/ios-static-table-view-storyboard/
https://github.com/Weebly/TableSchemer
https://github.com/Alliants/ALAccordion
Any other approach without UITableView?
Please help . Thanks in advance .
Static vs dynamic table will depend on your data source. Does your data source for your table change? If so you'll want a dynamic table, if not then you can design it out in a static one.
As for the accordion feature, what I've done in the past is to add a tap gesture recognizer to the header view of each section. When the tap is detected I change my datasource and reload the table view. What happens is that number of rows for section is called on reload, and I return 0 so that none of the rows show. When tapped again you can go back to showing the normal number of rows.
To get the animation you need to use delete rows with index paths and animate it.

how to create multiple button in ios?

I have create one custom cell and I want to create multiple button in that cell in ios. I have created multiple buttons in cell but I have problem on selection.I want to select first button by default.Check image for better understanding
Image
I would make this a collectionView that allows single selection. This is because you are representing sizes/dimensions and they come in notoriously different and arbitrary scales (0-14, XS-XL, 28-44, etc). If you make a it a collection view it very easy to handle arbitrary size scales by modifying the collection view datasource methods. If you make this a fixed set of buttons and someone comes along and changes the size scale, you have a problem.

Dynamic uiview layout with auto layout

I'm working with autolayout and its been going very well so far but right now I am at lost as to the way to proceed to achieve the design I want.
I got a a small questionnaire with 2 sections. Each section is embedded in its own UIView with each section's view containing an uiview per question.
My problem is, I want to add the question dynamically, say only show question 2 of section 1 when the user enter a certain input in question 1.
I first attempted to show each section by using using addsubview for the question view and reseting the frame of the section dynamically using setFrame: before realizing this method was not gonna work properly with autolayout (for example, since my questionaire is contained in a scrollview, scrolling will call the loadsubviews method on the scrollview and reset the section's view to their original size...)
What would be the proper way to achieve this? Using a tableview with a variable size perhaps? Or programatically creating layoutconstraint?
What I ended up doing is Dan F suggestion of using a tableview. I used the answer in this great post https://stackoverflow.com/a/12574544/865632 to create static tableview in view container allowing me to have static cell uitableview without having to cluster my main view controller with dummy tablecontroller

Resources