Триггерные кнопки на сенсорной панели при скольжении

Я создал сенсорную панель с множеством разноцветных кнопок. Пользователь часто меняет цвет с помощью кнопок. При нажатии кнопки некоторые графические элементы текущего окна меняются в зависимости от цвета кнопки. Я хотел бы, чтобы, проводя пальцем по кнопкам, элементы меняли свой цвет, не дожидаясь события «подправить внутри».

Есть ли быстрый способ сделать это?

РЕДАКТИРОВАТЬ: я думаю, что способ сделать это - использовать кнопку типа momentaryPushIn или создать класс, производящий подкласс кнопки и передающий что-то вроде события "касание внутри".

Я бы предпочел первый метод, но я нахожу очень плохую документацию.


person Nisba    schedule 01.08.2017    source источник
comment
Это обязательно должны быть кнопки? Почему бы не использовать скруббер? Если вас интересует решение для скруббера, скажите об этом, и я предоставлю вам дополнительную информацию.   -  person Roman Roba    schedule 02.08.2017
comment
У меня всего 8 цветов, поэтому правильнее было бы использовать кнопки   -  person Nisba    schedule 02.08.2017
comment
Вы можете вставить только 8 itemViews   -  person Roman Roba    schedule 02.08.2017
comment
О, я думаю, это может сработать!   -  person Nisba    schedule 02.08.2017
comment
@RomanRoba, можешь предоставить мне больше информации? Благодарю вас!   -  person Nisba    schedule 02.08.2017


Ответы (1)


Поскольку вы одобрили решение Scrubber, вот оно:

Во-первых, вам нужно создать экземпляр NSScrubber и вставить его в сенсорную панель. Убедитесь, что режим выбора будет фиксированным.

yourScrubber.mode = .fixed

Затем для выделения (просто чтобы контур был глазами, без этого контура все будет работать правильно) установите Selection Overlay Style на .outlineOverlay.

youtScrubber.mode = .selectionBackgroundStyle = .outlineOverlay

Затем установите делегатов для источника данных и для событий выбора.

yourScrubber.delegate = self
yourScrubber.dataSource = self

Затем верните количество элементов в скруббере

public func numberOfItems(for scrubber: NSScrubber) -> Int {
    return 8 
}

Теперь вам нужно вставить элементы (NSScrubberItemView). Который также может быть заполнен NScrubberImageItemView или NScrubberTextItemView или даже вашим собственным NSView.

Есть много способов заполнить содержимое скруббера, для простого случая, когда вы предоставляете изображения, это будет выглядеть так:

public func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
    let itemView = scrubber.makeItem(withIdentifier: "colorIdentifier", owner: nil) as! NSScrubberImageItemView
    itemView.image = yourImage
    return itemView
}

Теперь вы должны увидеть что-то вроде этого: (я использовал случайные изображения для своего скруббера)

введите здесь описание изображения

Также вы должны иметь возможность видеть (если вы включили схему) выбранные элементы: введите здесь описание изображения

Хорошо, а теперь самая важная часть, как получить желаемый эффект: (использование метода делегированного протокола)

public func scrubber(_ scrubber: NSScrubber, didHighlightItemAt highlightedIndex: Int) {
    print("highlight = \(highlightedIndex)")
    //your code here
}

Что приводит к чему-то вроде этого: (обратите внимание на окно вывода) введите здесь описание изображения

Вы также можете добавить интервал между ячейками, определяя ширину ячейки:

func scrubber(_ scrubber: NSScrubber, layout: NSScrubberFlowLayout, sizeForItemAt itemIndex: Int) -> NSSize {
    return NSSize(width: yourWidth, height: 30)
}

Также, возможно, вы найдете применение для:

optional public func scrubber(_ scrubber: NSScrubber, didSelectItemAt selectedIndex: Int)
person Roman Roba    schedule 02.08.2017
comment
Спасибо, как только я попробую код, я дам вам знать, если у меня возникнут какие-либо проблемы. - person Nisba; 06.08.2017
comment
@roman-roba Отлично! О NSSize(width: yourWidth, height: 30) как возможна пропорциональная ширина для всех элементов и выбранного элемента с фиксированной шириной, такой как фотография в MacOS? Спасибо - person Joannes; 06.09.2017
comment
Вызов метода, который я предоставил, будет вызываться для каждого из ваших элементов. Поэтому используйте itemIndex, чтобы определить ваши конкретные ячейки, которые вы хотите уменьшить/увеличить. Дайте мне знать, если это то, что вы искали. - person Roman Roba; 06.09.2017