I know this thread is pretty old, but I have a solution. When it comes to scale by screen size, the trick is to use a reference resolution that will scale up and down in a way that will fit AND set the match so it knows how to scale. I have been using .5 for that. Here are a couple examples of common sizes that you can use to scale up and down in Unity. I like to use these sizes because they have a scale up and down that is in the common range. When using an image or sprite that only works in one aspect, you can check the preserve aspect box to make sure that image looks right every time. If you're just coloring the button, you don't need to use this option.
- 640 x 960 (SD)
- 1280 × 720 (HD)
Another thing to consider is how the objects will remain in the frame when changing from landscape to portrait, as well. By default, Unity sets the anchor points to the center of the canvas. If you set them to the closest corner instead you will notice that when changing the landscape it will also maintain the proximity to the anchor point that was set.
[ Credit Unity Docs]
Doing these things together should help with most resolutions.
Another side note, when objects are set to be children of objects that are already children of the Canvas, the anchor points are then set back to center of the object it's a child of. This can also cause undesired results.
Here are samples of a project I put together for this purpose: