選ハイライトNSCollectionView
-
23-09-2019 - |
質問
私はワー NSCollectionView
一番が重要です。って、ハイライトの選択された項目に収集します。
またこれらの作業の前にSnow Leopardで何かが変わっても私の指ので、私は NSCollectionView
その際は修正の基本的な試験、AppleのドキュメントをNSCollectionView。
は、コレクションビューの動作の高速起動します。しかし、このガイドな議論などの有害元素を含む "There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
この一例として行った次のステップの結合配列のコントローラに NSCollectionView
のコントローラのキー selectionIndexes
, 考えることこれに結合する他の選択にいつの間に NSCollectionView
配列をコントローラーと焼成、KVOに通知する私もの NSCollectionView
を選択可能IB.
が表示される選考委員 NSCollectionView
このコUIの景色はあまり見ないデフォルトの選択されます。
その後、私の問題も付関係する問題ですが、二つの質問をします。
- うまコンパイルしようとしたところの選択アイテムです!
- どんなショーハイライトの所蔵品は何でしょうか。
NSCollectionView
'sプログラミングガイドおうというのは、ごくまれなものだとの間での検索は、Googleが引き上げ前のSnow Leopardの実装を使用し、ビューは別XIBファイルです。
後者は、別途XIBファイルのリスナーをアンインストール)で、私はなぜこの前提条件その他いている疑いがあるAppleのではないと付属のビューのプロフィールにアクセスした、コレクションビュー。
ごきげんよう、トメ子ですくすることができない"の木の樹"の問題-さんの"とうっ!?
通常通り、当援をよろしくお願いいたします。
更新1
ですが、きっかけになるかもしれないと、選択中の項目には、ドルだけではなく、図に示.に興味のあるコーヒーに飽きたら寿司に選択状態の画面アイテムを前提とはないのリンゴガイド):
のコントローラー(私のテストケースのアプリを委譲が少ないために
にawakeFromNib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
新しい方法
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController selectedObjects] count] > 0)
{
if ([[personArrayController selectedObjects] count] == 1)
{
personModel * pm = (PersonModel *)
[[personArrayController selectedObjects] objectAtIndex:0];
NSLog(@"Only 1 selected: %@", [pm name]);
}
else
{
// More than one selected - iterate if need be
}
}
}
なdealloc非GC
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
まだ検索のハイライトの分解能...
更新2
たMacatomyのアドバイスだった。投稿に関連するクラスメソッドを見ると、私はそれが間違っている。
MyView.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
MyView.m
#import "MyView.h"
@implementation MyView
@synthesize selected;
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect
{
NSRect outerFrame = NSMakeRect(0, 0, 143, 104);
NSRect selectedFrame = NSInsetRect(outerFrame, 2, 2);
if (selected)
[[NSColor yellowColor] set];
else
[[NSColor redColor] set];
[NSBezierPath strokeRect:selectedFrame];
}
@end
MyCollectionViewItem.h
#import <Cocoa/Cocoa.h>
@class MyView;
@interface MyCollectionViewItem : NSCollectionViewItem {
}
@end
"MyCollectionViewItem.m*
#import "MyCollectionViewItem.h"
#import "MyView.h"
@implementation MyCollectionViewItem
-(void)setSelected:(BOOL)flag
{
[(MyView *)[self view] setSelected:flag];
[(MyView *)[self view] setNeedsDisplay:YES];
}
@end
解決
そのハードすぎない。にしてください選択が可能にNSCollectionViewインターフェイスビルダを構築します。そしてNSViewサブクラスを使用していることをお試作眺めることを宣言します物件という選択":
@property (readwrite) BOOL selected;
更新コードはこちら(スーパーコール)
サブクラスNSCollectionViewItem、オーバーライド-setSelected:
- (void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[(PrototypeView*)[self view] setSelected:flag];
[(PrototypeView*)[self view] setNeedsDisplay:YES];
}
その後を追加する必要がありますコードプロトタイプビューのdrawRect:を描画するメソッドのハイライト:
- (void)drawRect:(NSRect)dirtyRect
{
if (selected) {
[[NSColor blueColor] set];
NSRectFill([self bounds]);
}
}
それだけで満の青色の場合、その選択が可能なカスタマイズに強ください。使いことに、自分のアプリです。
他のヒント
が異なる背景色にすれば足りるものとしますとハイライトするのは簡単で、NSBoxの項目でコレクションアイテム。のNSBoxのハイライトカラーの選択です。セットのNSBoxカスタムの記入します。セットのNSBoxに透過的です。
Bindの透明性の属性NSBoxの選択した属性ファイルのオーナ(コレクションアイテム) 値を設定するトランスの透明性に結合するNSNegateBoolean.
また添付フビルダ画面で拒否されたbcosんぱ:-(
でも別の言い方をされた場合は、サブクラスNSViewおprotoypeます。
おサブクラス化NSCollectionViewItemオーバーライド setSelected:
- (void)setSelected:(BOOL)selected
{
[super setSelected:selected];
if (selected)
self.view.layer.backgroundColor = [NSColor redColor].CGColor;
else
self.view.layer.backgroundColor = [NSColor clearColor].CGColor;
}
のを示したことを強調しましたすべての人の前にして、してください選択が可能にNSCollectionViewインターフェイスビルダを構築します。
以降にお答えたスーパーも私にとって、ここが私の取ります。変更のサブクラスの多彩な製品項目SelectableCollectionViewItem.こちらです。付属結合性textColor物件に引っ掛けテキストのラベルtextColor結合す。
@implementation SelectableCollectionViewItem
+ (NSSet *)keyPathsForValuesAffectingTextColor
{
return [NSSet setWithObjects:@"selected", nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.wantsLayer = YES;
}
- (void) viewDidAppear
{
// seems the inital selection state is not done by Apple in a KVO compliant manner, update background color manually
[self updateBackgroundColorForSelectionState:self.isSelected];
}
- (void)updateBackgroundColorForSelectionState:(BOOL)flag
{
if (flag)
{
self.view.layer.backgroundColor = [[NSColor alternateSelectedControlColor] CGColor];
}
else
{
self.view.layer.backgroundColor = [[NSColor clearColor] CGColor];
}
}
- (void)setSelected:(BOOL)flag
{
[super setSelected:flag];
[self updateBackgroundColorForSelectionState:flag];
}
- (NSColor*) textColor
{
return self.selected ? [NSColor whiteColor] : [NSColor textColor];
}
私の場合はたいと思ったイメージです(チェックマーク)を示すための選択オブジェクトです。ドラッグしてImageWellコレクションに項目をペン先です。希望の画像をマークして非表示になります。へのバインディング検査と結合する隠れた属性のコレクションビュー。
(私の場合は、作成した別のペン先のためにCollectionViewItem、その牲ファイルのオーナーを想定しています。の場合の場合はこの限りではありません、Item viewのペン先としての多彩な製品を結合コレクションビューの項目)
セットモデルのキーパスとして selected
び値トランス NSNegateBoolean
.私が今までの個々の細胞/項目を選択した画像の見えることを示すようにすることができます。
追加変更の答えです。
設定NSBoxとのことです。単に新しいIB書いCollectionItem)ドラッグするNSBoxを空にします。さらに、すべての要素として必要な内です。現在クリックでファイルのオーナーの設定カスタムクラスとして NSCollectionViewItem
.
のペン先が NSCollectionView
変更のペン先の名前 CollectionViewItem
のNSBoxで結んで、残りの要素 Files Owner
.レーベルでと同様になるでしょう:
現在のハイライトカラーとして 変更 うえ、希望の色の組み合わせを塗りオプションの設定 NSBox
透明なものと結合する透明性の属性は以下の通りです。
今時のコレクションビューの項目を選択した対応することができるでしょう、ラフの塗りつぶしの色のボックス。
お NSCollectionViewItem
サブクラスのオーバーライド isSelected
変更の背景色。試験macOS10月14かつ迅速な4.2
class Cell: NSCollectionViewItem {
override func loadView() {
self.view = NSView()
self.view.wantsLayer = true
}
override var isSelected: Bool {
didSet {
self.view.layer?.backgroundColor = isSelected ? NSColor.gray.cgColor : NSColor.clear.cgColor
}
}
}
これは凄さんの観光スポットを表!ったので苦労す。
の明確化のためにその他のもの
[(PrototypeView*)[self view] setSelected:flag];
[(PrototypeView*)[self view] setNeedsDisplay:YES];
交換PrototypeView*の名前をプロトタイプクラスの名前です。
の場合の掘削が周りに更新し迅速な解 この対応.
class MyViewItem: NSCollectionViewItem {
override var isSelected: Bool {
didSet {
self.view.layer?.backgroundColor = (isSelected ? NSColor.blue.cgColor : NSColor.clear.cgColor)
}
}
etc...
}
こちらは完全に迅速にNSCollectionViewItemと。設定するのを忘れずに、NSCollectioViewを選択可能IBャーナルのバックナンバ.の経験のmacOSモハベ(10月14)、高シエラ(10.13.6).
import Cocoa
class CollectionViewItem: NSCollectionViewItem {
private var selectionColor : CGColor {
let selectionColor : NSColor = (isSelected ? .alternateSelectedControlColor : .clear)
return selectionColor.cgColor
}
override var isSelected: Bool {
didSet {
super.isSelected = isSelected
updateSelection()
// Do other stuff if needed
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.wantsLayer = true
updateSelection()
}
override func prepareForReuse() {
super.prepareForReuse()
updateSelection()
}
private func updateSelection() {
view.layer?.backgroundColor = self.selectionColor
}
}