【问题标题】:Set UITableViewCell frame with margins in Swift在 Swift 中设置带有边距的 UITableViewCell 框架
【发布时间】:2017-06-24 23:22:06
【问题描述】:

我正在尝试制作具有左右边距/插图的 UITableViewCell。我过去使用以下代码使用 Objective-C 完成了此操作:

- (void)setFrame:(CGRect)frame {
    frame.origin.x += 25;
    frame.size.width -= 2 * 25;
    [super setFrame:frame];
}

这段代码不会直接转换为 Swift,因为现在我必须覆盖公共框架变量,但是将这段代码放在该变量的设置器中没有任何效果。我如何在 Swift 中使用这个或类似的技术来显示边距?

这是我尝试过的 Swift:

private var otherFrame: CGRect = CGRectZero
override public var frame: CGRect {
    get {
        return otherFrame
    }
    set {
        otherFrame = frame
        otherFrame.origin.x += 25
        otherFrame.size.width -= 2 * 25
    }
}

【问题讨论】:

  • 为什么要把它放在getter中?这是对 setter 的覆盖。
  • 哎呀我的意思是二传手,我编辑了问题
  • 用您尝试的 Swift 代码更新您的问题,并清楚地解释您遇到的问题。

标签: ios objective-c swift uitableview


【解决方案1】:

Objective-C 代码的直接翻译是:

override var frame: CGRect {
    get {
        return super.frame
    }
    set {
        var frame = newValue
        frame.origin.x += 25
        frame.size.width -= 2 * 25

        super.frame = frame
    }
}

不需要额外的属性。您在 setter 中使用隐式值 newValue

【讨论】:

  • 谢谢!我浪费了整整 2 天才找到这个。像魅力一样工作!
  • 如果你只是减去宽度,似乎某些标签文本会被截断。如何调整高度来解决这个问题?
【解决方案2】:

您可以通过这种方式告诉您单元格不要跟随 tableView 的边距:

cell.preservesSuperviewLayoutMargins = false

并以这种方式设置单元格的边距:

cell.layoutMargins = UIEdgeInsets(top: 0, left: 25, bottom: 0, right: 25)

【讨论】:

  • 你会把这个放在 cellForRowAtIndexPath 中吗?
  • 我愿意,除非您的单元有自定义类。在那种情况下,也许它会从那里开始工作。
  • 你会把它放在自定义类的什么地方?布局子视图?
  • 在 awakeFromNib() 中
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2015-10-29
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多