73

我正在寻找一种将padding属性添加到 UIView 的方法。理想情况下,我想避免子类化并将其放在一个类别中。用法类似于:

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

并且可能还有一个paddingBox属性,它将返回CGRect描述内部填充框的大小和位置。

现在,如何在一个类别中实现类似的东西。我最初虽然使用bounds,但不幸的bounds是, 的大小与frame(始终相同)的大小相关,只有坐标可以不同。

4

7 回答 7

53

这通常通过在视图中设置边界来完成。所以如果你想要一个 10 的插页,你可以这样做:

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

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

希望这可以帮助!:)

在 Swift 5+ 中更新,它是

view.bounds = view.frame.insetBy(dx: 10.0, dy: 10.0);
于 2013-02-13T15:46:10.470 回答
40

Swift 3 更新

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

:)

于 2017-01-31T21:34:08.457 回答
37

更新:由于 iOS11 你应该使用directionalLayoutMargins而不是layoutMargins.

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

从 iOS 8 开始,每个视图现在都有一个layoutMargins对应于 padding 的属性。

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

当您使用 AutoLayout 时,带有 的格式|-[subview]-||-引用用 定义的边缘layoutMargins

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

于 2017-01-31T21:41:32.513 回答
12

您可以覆盖 alignmentRectInsets 属性。这是 Swift 4 中的一个示例

class YourCustomView: UIView {

    override var alignmentRectInsets: UIEdgeInsets {
        return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    }
}
于 2017-11-27T16:19:55.897 回答
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);
于 2015-05-01T23:14:20.360 回答
7

Swift 4 的更新:

self.yourView.layoutMargins = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
于 2019-03-13T15:59:05.120 回答
2

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

    yourView.frame = yourView.frame.inset(by: UIEdgeInsets(top: .zero, left: 5.0, bottom: 5.0, right: .zero)
于 2019-06-25T03:24:48.273 回答