如何向NSScrollView添加偏移复选框列表?

时间:2017-02-12 17:51:36

标签: swift macos

我有一个NSScrollView,我试图填充复选框(NSButton / NSToggleButton)。我添加的复选框的数量应该等于数组中的项目数。这部分正在运作。

以下代码成功地将复选框添加到滚动视图,但它们全部相互叠加。我试图添加它们,但在"列表视图中相互抵消" iOS上的tableview等方式。这是我的代码:

for calendar in self.allCalendars {
     self.allCalendars.append(calendar as EKCalendar)        
     let checkbox = NSButton.init(checkboxWithTitle: calendar.title, target: self, action: #selector(self.checkboxDidChange))
     checkbox.setButtonType(NSToggleButton)
     self.checkboxArray.append(checkbox as NSButton)
     self.addSubview(checkbox)       
}

以下是结果的屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

这是你可以实现的东西,它会改变你循环的方式,以便你有一个每次迭代的索引,但它可以帮助你计算某种垂直间距:

for i in 0 ..< allCalendars.count {

    let margin: CGFloat = 5.0   // Or whatever you want the padding on the left to be

    let vertSpacing: CGFloat = 10.0    // However much separation you want in between boxes

    self.allCalendars.append(allCalendars[i] as EKCalendar)
    let checkbox = NSButton.init(checkboxWithTitle: allCalendars[i].title, target: self, action: #selector(self.checkboxDidChange))
    checkbox.setButtonType(NSToggleButton)

    // Now you can set the frame of the checkbox within it's superview's coordinate system
    // This calculates it based on the bounds.height, if you want to use a custom height, substitute that.
    checkbox.frame = CGRect(x: margin, y: vertSpacing + (vertSpacing + checkbox.bounds.height)*CGFloat(i), width: checkbox.bounds.width, height: checkbox.bounds.height)

    self.checkboxArray.append(checkbox as NSButton)
    self.addSubview(checkbox)

}

基本上,y值vertSpacing + (vertSpacing + checkbox.bounds.height)*CGFloat(i)的作用是从第一个复选框开始,使用你设置垂直间距值的y-pos,然后对于之后的每个复选框,它将设置它上一个复选框下方的一个垂直空间值。该解决方案将假设每个复选框具有相同的高度。如果您不想使用bounds.height值,可以设置自定义高度。