2017-02-12 143 views
1

我有一個NSScrollView,我試圖用複選框填充(NSButton/NSToggleButton)。我添加的複選框數量應該等於數組中的項目數量。這部分工作。如何將偏移複選框列表添加到NSScrollView?

以下代碼成功將複選框添加到滾動視圖中,但它們全部在彼此之上。我試圖添加它們,但以「列表視圖」方式(如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

你看過'NSTableView'嗎? –

+0

不,我沒有。它看起來更適合實現我在這裏要做的事情。這是我的第一個osx應用程序,並沒有意識到這是可用的。很明顯,獲得我目前實施的是我的第一選擇,但'NSTableView'看起來是一個不錯的選擇。 –

+1

你以前做過iOS編程嗎?每個按鈕的左上角都有一個0,0的框架,因此它們全部相互重疊。您需要在添加框架時調整框架。如果你不想進行數學運算,你也可以查看'NSStackView'。 –

回答

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)母鹿s是它首先啓動第一個複選框,不管你設置了垂直間距值是什麼,然後對於每個複選框,它將在前一個複選框下面設置一個垂直空間值。該解決方案將假定每個複選框具有相同的高度。如果您不想使用bounds.height值,則可以設置自定義高度。

+0

工作!謝謝。我只需要在循環中添加'let calendar = self.allCalendars [i]',這樣我就可以獲得'calendar.title' –

+0

哦!對不起,我只是編碼了白板風格。我會爲未來的人編輯我的答案。很高興它適合你 – Pierce

相關問題