Adding padding to an UIView

IosIphoneCocoa TouchUiviewUikit

Ios Problem Overview


I'm looking for a way to add a padding property to an UIView. Ideally, I would like to avoid subclassing and putting it in a category. The usage would be something like:

myview.padding = UIEdgeInsetsMake(10, 10, 10, 10);

And maybe have a paddingBox property as well which would return a CGRect describing the size and position of the inner padding box.

Now, how would one implement in a category something like that. I initially though of using bounds, but unfortunately the size of the bounds is linked to the size of the frame (always the same) only the coordinates can differ.

Ios Solutions


Solution 1 - Ios

This is generally done by setting the bounds within the view. So if you wanted an inset of 10 all round you could do:

view.bounds = CGRectInset(view.frame, 10.0f, 10.0f);

The bounds defines the drawable area of the view, relative to the frame. So this should give in effect a padding. You can then get the 'paddingBox' just from the bounds.

Hope this helps! :)

Update in Swift 5+, It's

view.bounds = view.frame.insetBy(dx: 10.0, dy: 10.0);

Solution 2 - Ios

Update for Swift 3

view.bounds = view.frame.insetBy(dx: 10.0, dy: 10.0)

:)

Solution 3 - Ios

Update: Since iOS11 you should use directionalLayoutMargins instead of layoutMargins.

Source: https://developer.apple.com/documentation/uikit/uiview/1622566-layoutmargins?language=objc

Since iOS 8, each view has now a layoutMargins property which corresponds to the padding.

myview.layoutMargins = UIEdgeInsetsMake(10, 10, 10, 10);

When you use AutoLayout, a format with |-[subview]-|, |- will refer to the edges defined with layoutMargins.

Source: https://developer.apple.com/reference/uikit/uiview/1622566-layoutmargins?language=objc

Solution 4 - Ios

You can override the alignmentRectInsets property. Here is an example in Swift 4

class YourCustomView: UIView {
    
    override var alignmentRectInsets: UIEdgeInsets {
	    return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    }
}

Solution 5 - Ios

What you really have to do is create a view and add a subview to it. Make one view the background and give it the frame you want. Then make the second subview the frame you want with the edge insets.

UIView backgroundView = new UIView(CGRect.FromLTRB(0, 0, 100, 100))
{
	BackgroundColor = backgroundGray,
};

//Will have a right edge inset of 10
UIView edgyView = new UIView(CGRect.FromLTRB(0, 0, 90, 100))
{
	BackgroundColor = backgroundGray,
}

backgroundView.AddSubview(edgyView);

Solution 6 - Ios

Update for Swift 4:

self.yourView.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)

Solution 7 - Ios

You can inset the view's frame/bounds like this:

    yourView.frame = yourView.frame.inset(by: UIEdgeInsets(top: .zero, left: 5.0, bottom: 5.0, right: .zero)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMedaView Question on Stackoverflow
Solution 1 - IosGeorge GreenView Answer on Stackoverflow
Solution 2 - IosMarcus Vinicius KuquertView Answer on Stackoverflow
Solution 3 - IosyageekView Answer on Stackoverflow
Solution 4 - IosOmar AlbeikView Answer on Stackoverflow
Solution 5 - IosGandalf458View Answer on Stackoverflow
Solution 6 - IosBoomerangeView Answer on Stackoverflow
Solution 7 - IosRadu CiobanuView Answer on Stackoverflow