向 UIView 添加填充

我正在寻找一种方法来添加一个 padding属性到 UIView。理想情况下,我希望避免子类化并将其放在一个类别中。用法大概是这样的:

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

也许还有一个 paddingBox属性,它会返回一个 CGRect来描述内部填充框的大小和位置。

现在,如何在一个类别中实现这样的东西。我最初想使用 bounds,但不幸的是,bounds的大小与 frame的大小(总是相同的)只有坐标可以不同。

115705 次浏览

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

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

边界定义了视图相对于框架的可绘制区域。所以实际上应该有一个填充物。然后您可以从边界获得‘ paddingBox’。

希望这个有用! :)

在 Swift 5 + 中更新,它是

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

您真正需要做的是创建一个视图并向其添加一个子视图。制作一个视图的背景和给它的框架你想要的。然后使第二个子视图的框架,你想与边缘插入。

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

Swift 3的更新

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

:)

更新 : 因为 iOS11应该使用 directionalLayoutMargins而不是 layoutMargins

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

从 iOS8开始,每个视图现在都有一个与填充对应的 layoutMargins属性。

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

当您使用自动布局(一种使用 |-[subview]-|的格式)时,|-将引用用 layoutMargins定义的边。

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

可以重写 alignmentRectInsets 属性

class YourCustomView: UIView {


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

Swift 4的更新:

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

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

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