给UIView添加内边距

78

我正在寻找一种方法来为UIView添加padding属性。理想情况下,我希望避免子类化并将其放入类别中。使用方法可能如下:

我正在寻找一种在不使用子类化和类别的情况下,为UIView添加一个padding属性的方法。该属性将用于以下方式:
myview.padding = UIEdgeInsetsMake(10, 10, 10, 10);

也许还可以加上一个 paddingBox 属性,它将返回描述内部填充框大小和位置的 CGRect

现在,如何在类别中实现这样的内容呢?我最初考虑使用 bounds,但不幸的是,bounds 的大小与 frame 的大小相连(始终相同),只有坐标可以不同。


如果你在考虑 Android 中的“padding”——即视图背景被绘制但其内容不被包含在内的空间,我认为 iOS 并没有将这个概念内置到它的视图中。很奇怪,对吧? - androidguy
7个回答

58

通常可以通过在视图中设置边界来实现。所以如果您想要一个四周都有10的插图,可以这样做:

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

边界定义了视图相对于框架的可绘制区域,因此这应该有效地提供了填充。然后,您可以仅从边界获取'paddingBox'。

希望这有所帮助! :)

在Swift 5+中更新为

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

6
很不幸,这也改变了视图的大小。正如我在问题中提到的,文档指出边界矩形的大小与框架矩形的大小相关联,因此对其中一个的更改会影响另一个。换句话说,你发表的代码应该是-10而不是10,即使如此,它只会添加顶部和左侧填充,但是我会再次测试,以确保我没有漏掉任何东西。 - Meda
你有文档链接吗?因为我相当确定边界和框架的大小可能会不同。 - George Green
1
这里的https://dev59.com/PXRB5IYBdhLWcg3wAjRH和https://dev59.com/l3NA5IYBdhLWcg3wKaYx是关于此问题的好资料。 - George Green
嗯,我在文档中找到了它,现在正在进行实验以确认。我想要道歉,因为事实上是这样的。看起来你可能需要选择一个简单的子类。 - George Green
3
这段代码的意思是将 contentTextView 的边框缩进10个点(在水平和垂直方向上),并将其设置为新的边界。 - eildiz

41
更新: 自从iOS11以来,您应该使用directionalLayoutMargins而不是layoutMargins
来源: https://developer.apple.com/documentation/uikit/uiview/1622566-layoutmargins?language=objc 自iOS 8以来,每个视图现在都有一个layoutMargins属性,它对应于填充。
myview.layoutMargins = UIEdgeInsetsMake(10, 10, 10, 10);

当你使用AutoLayout时,格式为|-[子视图]-|的布局将使用layoutMargins定义的边缘。
来源:https://developer.apple.com/reference/uikit/uiview/1622566-layoutmargins?language=objc

40

Swift 3更新

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

:)


15

你可以覆盖alignmentRectInsets属性。这里有一个Swift 4的示例。

class YourCustomView: UIView {

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

11

你真正需要做的是创建一个视图并向其中添加一个子视图。将一个视图设置为背景,并赋予它所需的框架。然后使用边缘插图将第二个子视图设置为所需的框架。

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);

7

Swift 4更新:

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

2
您可以像这样插入视图的框架/边界:

您可以像这样插入视图的框架/边界:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接