Sizes of buttons with images - image

In my app I have two instances of the same kind of button (an own class I've made which subclasses Button and sets a specific UIID and also does some other things...)
One of them is added into a BoxLayout Y which is added as center in a BorderLayout. The other component in the BoxLayout is a label which is above the button.
The other one is added in a GridLayout which is added as south in another BorderLayout. The grid is 1 row and 3 columns (the button is one of the columns). The horizontal size is ample so there is no need to make it smaller to fit horizontally.
My issue is that these two buttons are of different sizes. The first one is significantly larger than the second. I suspect that the second one has been made smaller somewhere in the process but I can't understand why. I would like to have the first button be the same size as the other one, or the same vertical size (with the corresponding horizontal size) as the label above it.
I have tried to use the setHeight and setPreferredHeight of the button. The result was that the button was actually made smaller, but not the image on it so the image was cropped.
I have also tried to use the setSameHeight with the first button and the label above it, but the result was only that the label was made larger.

The problem you're having is the GridLayout Container.
What GridLayout does is that it divides the Container into 3 equal sizes and shrink anything in any of the column to fit within its space.
TableLayout on the hand is similar to GridLayout except that it's flexible. It adjusts itself to accommodate the size of the biggest component in it.
Change that GridLayout to TableLayout with the same number of rows and columns, and the Buttons would be fixed.
I will suggest you also add the second button to a BoxLayout container before placing it in the TableLayout.

Related

Does UI Automation ScrollPattern have a Bounding Rect or is there a reliable way to get it?

I've been messing around with UI Automation and Scrolling. I found that in notepad if you take the bounding rectangle of the scrollable window, subtract out the size of any scrollbar bounding rectangles, it scrolls perfectly. However, trying the same thing against ISpy++, which aligns the top treeview item perfectly on each scroll even when there may be one or two pixels of the next item in the view at the bottom.
The problem with that is it reports the scroll amount requested was set. Say the view was 6.384914% and you do all the math to calculate where you scroll the view to the next window, say it came out to 24.382102 (completely made up number), so you scroll there, but it really didn't because it aligned the top item which otherwise would be missing a few pixels based on height of window. You read back where scrolling decided to set it and it says it was 24.382102 (note that when the scroll actually moves a full item it does report a different final scroll position and so can be calculated out).
What would solve the above is if we knew the actual bounding rectangle of the view that represents the 6.384914% so that those extra pixels wouldn't be considered part of the view, when you move to the next page, you're now align to where the next page would actually start. In this case of the tree, the bounding rectangle would be aligned to all items that fit plus the final spacing (or that could be part of the top of the view).
I wanted to scroll and get the data perfectly without any overlaps (except on final page of course, but that could be calculated out when you have the proper aligned boundaries that matches scrolling) or extra spacing.
Is there a way to do that, that I'm missing?
TIA!!

How to adapt Xib views and buttons to fit all devices using Auto layout and contraints

I'm going to show you an image that contains my first UIViewController presented in Interface Builder (using the 600x600 Any/Any View).
MainViewController
For now, just look at the UIButton with the C label and the Play button. I added Align center x to: horizontal constraints to both. When I preview what I have (forgetting about the other views and buttons you see), the 2 buttons are centered properly. However, when I switch different device sizes, they do not change size...which makes sense.
What I want is for a way to make those 2 buttons stay proportionally circular and centered on the superview, but adapt their size and Y-position depending on the device size. What constraints would I need to attach in order for that to work? I don't want the buttons to be stuck in the spots you see in the image, I want them to adapt to the device size.
To talk about this further. The game 'Color Switch' does not appear to use constraints in terms of having any view/image/button/label constrained to a certain y or x position. Going from a 5c to a 6s, it's like looking at a blown up version of the game. The buttons and title label at the top are not constrained to the same y position on each device.
You could create constraints to center the buttons to the top-level view and then make their width proportional to the view width. Then on a larger screen, the buttons will be larger and on a smaller screen, they will be smaller.

NSTableView: make total width of all columns always be the width of the visible portion of the table

I have a NSTableView with 2 columns. I'd like to know if there is a way to make it so that the right edge of the right column is always on the right edge of the clip view (so that it never goes beyond the clip view and horizontal scrolling isn't enabled), yet maintaining the ability to resize the two columns by moving the separator between them. This is essentially the same behavior as a split view.
I know IB offers options to control the resizing of columns, but I can't seem to enforce the rule that the total width of the two columns must be the width of the clip view (the visible portion of the table).

Resize multi-line text field

So I just returned to GUI programming after a long time on Mac OS X. I heard about this great feature called Auto Layout. For my project I want a very simple layout: a textfield dominating the window, with a couple buttons at the bottom. When I resize the window, I want the textfield to resize with it.
I thought that was simple task: constraints on the 4 edges and Height and Width >= what I have in Interface Builder:
If I set it like this, I can't resize the window vertically, only horizontally. If I drop either the Height or Width constraint, it will shrink to a tiny size in a corner.
How should I set my constraints so that the textfield resize with the window?
To resize text field with the window size you need to add constraints to all the four edges of the text field! As per your screen shot you haven't added any constraints to the right and bottom edge, instead you have added dimensions (or say height and width)!
And to avoid making text field terribly small you can add min-width and height to it.

How to have a view resize using Xcode's auto layout

I am using Xcode's auto layout feature for the first time in a project where I have several NSPopUpButtons.
Now what I want to achieve is to have two popUpButtons in a row together with their labels and when the window is resized I want both popUpButtons to adjust their width while keeping the horizontal spacing between each other.
However no matter how I apply the constraints I just don't get the popUpButtons to change their size with the window. They will always break their horizontal spacing constraints and just increase/decrease the spacing to the labels. I hope it gets a bit clearer what I have done from this screenshot:
I have set the spacings between the labels and the popUpButtons to fixed values with 1000 priority and have set the width constraints fo the popUpButtons to be greater or equal to the initial size.
How must I set my constraints to have the popUpButtons resize?
While writing this question I realized what the trick is:
In the size inspector of the NSPopUpButton I had to reduce the Content Hugging Priority.
Obviously this controls how closely the view wants to 'hug' its content. So when the hugging priority is higher than the resize priority the view will not want to increase its size because that would mean to have more empty space between its bounds and its content.
Then in my special case, I could also pin both NSPopUpButtons to have the same width and voilĂ : the popUpButtons will perfectly resize while keeping the spacing constant.

Resources