কোনও এনএসভিউর জন্য পটভূমির রঙ পরিবর্তন করার সর্বোত্তম উপায়


149

আমি backgroundColorএকটি এর পরিবর্তন করার সেরা উপায় খুঁজছি NSView। আমি alphaএটির জন্য উপযুক্ত মুখোশ সেট করতে সক্ষম হতে চাই NSView। কিছুটা এইরকম:

myView.backgroundColor = [NSColor colorWithCalibratedRed:0.227f 
                                                   green:0.251f 
                                                    blue:0.337 
                                                   alpha:0.8];

আমি লক্ষ্য করেছি যে NSWindowএই পদ্ধতিটি রয়েছে এবং আমি NSColorWheelবা NSImageপটভূমির বিকল্পগুলির একটি বড় অনুরাগী নই , তবে তারা যদি সেরা, ব্যবহার করতে আগ্রহী।

উত্তর:


134

হ্যাঁ, আপনার নিজের উত্তরটি সঠিক ছিল। আপনি কোকো পদ্ধতিগুলিও ব্যবহার করতে পারেন:

- (void)drawRect:(NSRect)dirtyRect {
    // set any NSColor for filling, say white:
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];
}

সুইফটে:

class MyView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // #1d161d
        NSColor(red: 0x1d/255, green: 0x16/255, blue: 0x1d/255, alpha: 1).setFill()
        dirtyRect.fill()
    }

}

18
NSRectFillNSCompositeCopyভরাট করতে ব্যবহার করে, তাই এটির পিছনে যে কোনও কিছুই আঁটসাঁট হয়ে যাবে — এটি কোনও পূর্বপুরুষের দর্শনগুলির উপরে মিশ্রিত হবে না। আংশিক- (বা সম্পূর্ণ-) স্বচ্ছ রঙ দিয়ে পূর্ণ করার জন্য, ক্রিয়াকলাপের সাথে NSRectFillUsingOperation developer.apple.com/mac/library/docamentation/Cocoa/References/… ব্যবহার করুন NSCompositeSourceOver
পিটার হোসি

ওহ, এটা বোঝা যায়। আমি এনএসআরেক্টফিল চেষ্টা করেছিলাম কিন্তু স্বচ্ছতা কার্যকর হয়নি। আমি কোকো টাচ থেকে কোকোতে আসছি, এবং অবাক হয়ে দেখছি যে কোনও উপায়ে কোকো টাচ ফ্রেমওয়ার্কটি আরও সম্পূর্ণ (!)। আমি এনএসভিউর জন্য এমন একটি শ্রেণিবদ্ধকরণ করার কথা ভাবছিলাম যা আপনাকে এনএসওয়াইন্ডো বা ইউআইভিউয়ের মতো ব্যাকগ্রাউন্ড কালার সেট করতে দেয় তবে আপনি কোনও এক্সটেনশন দিয়ে ড্রয়ারকে ওভাররাইড করতে পারবেন বলে আমি মনে করি না।
ব্যাপ পাইরেট

দুঃখিত আমি স্বচ্ছতার অংশটি মিস করেছি। হ্যাঁ, কোকো স্পর্শ অনেক কিছুই সহজ করে তোলে। যদি আপনি কোকো টাচও করে থাকেন তবে নিজের উত্তরটি আসলে আরও ভাল, কারণ এটি আরও বহনযোগ্য।
মোহসেনার

আমি এটি পাই না, এটি দর্শনের শীর্ষে সাদা রঙ আঁকছে, আমি কেবল চেষ্টা করেছি। ব্যাকগ্রাউন্ড রঙ সম্পর্কে প্রশ্ন ছিল না?
aneuryzm

@ পেট্রিক - আপনার কাছে সুপার ড্রইরেক্ট কল করার দরকার হতে পারে :) বা আপনার যদি কিছু অন্যান্য জিনিস রয়েছে যা ব্যাকগ্রাউন্ডের শীর্ষে আঁকতে হবে বলে মনে করেন তবে নিশ্চিত হয়ে নিন যে সেগুলি এনএসআরেক্টফিল কলের পরে রয়েছে।
BadPirate

116

একটি সহজ, দক্ষ সমাধান হল ভিউরটিকে তার ব্যাকিং স্টোর হিসাবে কোর অ্যানিমেশন স্তরটি ব্যবহার করার জন্য কনফিগার করা। তারপরে আপনি -[CALayer setBackgroundColor:]স্তরটির পটভূমি রঙ সেট করতে ব্যবহার করতে পারেন ।

- (void)awakeFromNib {
   self.wantsLayer = YES;  // NSView will create a CALayer automatically
}

- (BOOL)wantsUpdateLayer {
   return YES;  // Tells NSView to call `updateLayer` instead of `drawRect:`
}

- (void)updateLayer {
   self.layer.backgroundColor = [NSColor colorWithCalibratedRed:0.227f 
                                                          green:0.251f 
                                                           blue:0.337 
                                                          alpha:0.8].CGColor;
}

এটাই!


6
যত্নবান: আপনার অ্যাপ্লিকেশনটিতে আপনার কাছে থাকতে পারে এমন কোনও ওয়েবভিউগুলিকে কলিং setLayer:বা setWantsLayer:ব্রেক করে খুব সৃজনশীল উপায়ে! (এমনকি বিভিন্ন উইন্ডোতেও ...)
rluba

1
মেথোডে setWantsLayer:সংজ্ঞায়িত করা হয়: স্তর-ব্যাক করা ভিউগুলি ব্যবহার করার সময় আপনার কখনই স্তরটির সাথে সরাসরি যোগাযোগ করা উচিত নয় । কখন setWantsLayer:এবং setLayer:বলা হবে তার ক্রম প্রাসঙ্গিক।
স্টিফান

আপনার স্তরটি সেট করা উচিত নয় তবে এটি এখনও অর্জন করতে পারেন। কালেক্টভিউ দেখুন ওজেক্ট.আইও / প্রবক্তা
১৪-

80

আপনি যদি স্টোরিবোর্ড প্রেমিকা হন তবে এখানে এমন একটি উপায় রয়েছে যাতে আপনার কোনও কোডের লাইন লাগবে না

NSBoxএনএসভিউতে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করুন এবং এনএসভিউর সাথে এনএসবক্সের ফ্রেমটিকে একই হিসাবে সামঞ্জস্য করুন।

কোনটি, এর বক্স টাইপ স্টোরিবোর্ড বা XIB পরিবর্তন শিরোনাম অবস্থানে কাস্টম যাই হোক না কেন "কিছুই না" হয়, বর্ডার টাইপ করুন, এবং সীমানার রঙ তোমাকে পছন্দ করি।

এখানে একটি স্ক্রিন শট হয়:

এখানে চিত্র বর্ণনা লিখুন

এটি ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


এনএসবক্স ব্যবহার করা আমার পক্ষে দুর্দান্ত কাজ করেছে। একটি স্তর-ব্যাক করা দৃশ্যে স্যুইচ করা পুনরায় আঁকানো সমস্যা সৃষ্টি করেছিল, যেখানে বাক্সটি দেয় নি।
হেনরিক

4
এটি একটি দুর্দান্ত এবং সহজ সমাধান যা
ডক্সে

এই রঙটি যদিও এনএসপিওভার ত্রিভুজগুলি করে?
রিবেনা

আমি কেবল অনুশোচনা করছি যে এই উত্তরটি দেওয়ার জন্য আমার কেবল একটি উক্তি আছে।
ওরিওন এলিজিল

33

যদি আপনি প্রথমে ওয়ান্টসলেয়ারকে YES এ সেট করেন তবে আপনি সরাসরি স্তরটির পটভূমি ম্যানিপুলেট করতে পারেন।

[self.view setWantsLayer:YES];
[self.view.layer setBackgroundColor:[[NSColor whiteColor] CGColor]];

26

কীভাবে এটি করব তা ভাবলাম:

- (void)drawRect:(NSRect)dirtyRect {
    // Fill in background Color
    CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
    CGContextSetRGBFillColor(context, 0.227,0.251,0.337,0.8);
    CGContextFillRect(context, NSRectToCGRect(dirtyRect));
}

ধন্যবাদ। আমার নোংরা রেক্টকে একটি সিজিআরেক্টে রূপান্তর করা দরকার। শেষ লাইনে সংশোধন করে আপনি CGContextFillRect(context, NSRectToCGRect(dirtyRect));কি নিজের উত্তর সম্পাদনা করতে পারবেন?
রস

1
তারা টোল ফ্রি
ব্রিজযুক্ত ছিল

6
-৪-বিট বা আইওএস তৈরি করার সময় বা or৪-বিটের মতো 32-বিট তৈরি করার সময়, এনজিআরেক্ট হ'ল সিজিআরেক্ট বলার অন্য একটি উপায়। যদি তা না হয় তবে এটি স্বতন্ত্র স্ট্রাক্ট এবং যদিও তারা একই সদস্যের সমন্বয়ে গঠিত হতে পারে তবুও তারা কখনই "টোল-ফ্রি ব্রিজড" হতে পারে না কারণ এটি কেবলমাত্র বস্তুগুলিকেই নির্দেশ করে এমন একটি শব্দ (স্ট্রাকগুলির একটি "ইসা" পয়েন্টার রয়েছে এবং পয়েন্টার ব্যবহার করে পাস করা হয়), তবে জেনেরিক স্ট্রাকচারগুলিতে নয়।
রাফেল শোয়েকার্ট

অঙ্কিত সময় ব্যবহারের ফলে অঙ্কিত সময়, ইত্যাদি ইত্যাদি ব্যবহার করা ক্যালায়ার 10.8 এবং তার বেশি সময়ের মধ্যে একটি ভাল সমাধান।
টম অ্যান্ডারসন

22

আমি এই সমস্ত উত্তর দিয়েছি এবং দুর্ভাগ্যক্রমে তাদের মধ্যে কেউই আমার পক্ষে কাজ করেনি। তবে প্রায় এক ঘন্টা অনুসন্ধানের পরে আমি এই অত্যন্ত সহজ উপায়টি পেয়েছি:)

myView.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 0.9);

8
নোট করুন যে এনএসভিউগুলির সর্বদা একটি স্তর থাকে না, এক্ষেত্রে এটি কিছুই করে না। ইওরেটোপারিসির উত্তর দেখুন।
ক্লে

3
আমি আমার নিয়ামক (সেলফাইমাস্টমভিউয়ের জন্য) ভিডডিডোড পদ্ধতিতে এই কোডটি সম্পাদন করার চেষ্টা করে অনেক সময় ব্যয় করেছি। আমি বুঝতে পেরেছি যে এর পরিবর্তে আপনার ভিউউইল অ্যাপ্লের পদ্ধতিটি ব্যবহার করা উচিত।
surfrider

21

সম্পাদনা / আপডেট: এক্সকোড 8.3.1 • সুইফট 3.1

extension NSView {
    var backgroundColor: NSColor? {
        get {
            guard let color = layer?.backgroundColor else { return nil }
            return NSColor(cgColor: color)
        }
        set {
            wantsLayer = true
            layer?.backgroundColor = newValue?.cgColor
        }
    }
}

ব্যবহার:

let myView = NSView(frame: NSRect(x: 0, y: 0, width: 100, height: 100))
print(myView.backgroundColor ?? "none")     //  NSView's background hasn't been set yet = nil
myView.backgroundColor = .red               // set NSView's background color to red color
print(myView.backgroundColor ?? "none")
view.addSubview(myView)

আমি মনে করি এটিই সবচেয়ে পরিষ্কার সমাধান, তবে এখানে Objc.io জনগণের বক্তব্যটি সম্পর্কে উদ্বিগ্ন: Obc.io/issues/14-mac/appkit-for-uikit- উন্নয়নকারীরা - "... আপনার কথোপকথনের চেষ্টা করা উচিত নয় সরাসরি স্তরগুলির সাথে, যেমন অ্যাপকিট সেই স্তরগুলির মালিক। আমি নিশ্চিত না যে কী ভুল হতে পারে। যেভাবেই হোক না কেন, আমি নিজের কোডটিতে এই সমাধানটি গ্রহণ করছি।
কেভিন স্লাইচ

7

সব থেকে ভালো সমাধান :

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.wantsLayer = YES;
    }
    return self;
}

- (void)awakeFromNib
{
    float r = (rand() % 255) / 255.0f;
    float g = (rand() % 255) / 255.0f;
    float b = (rand() % 255) / 255.0f;

    if(self.layer)
    {
        CGColorRef color = CGColorCreateGenericRGB(r, g, b, 1.0f);
        self.layer.backgroundColor = color;
        CGColorRelease(color);
    }
}

হে হে। এটি আপনি যদি প্রতিবার চালু করতে চান তা এলোমেলো ব্যাকগ্রাউন্ড রঙ করতে চান তবে কিছুটা জটিল হলেও ড্র
র্যাক্ট

: যদি এটি একটি বিজি রঙ অঙ্কন শুধু একটি ব্যাপার তারপর কি অগ্রাহ্য এর প্রয়োজন "drawRect"
নাগরাজ

হ্যাঁ, শীর্ষ উত্তর stackoverflow.com/a/2962882/285694 সেই প্রতিক্রিয়া দেয়। আমার প্রশ্নের আসলে একটি আলফা চ্যানেল থাকা দরকার, তাই আমি এটিকে একটি চেক দিয়েছি - stackoverflow.com/a/2962839/285694 - প্রযুক্তিগতভাবে এই প্রশ্নটি একটি এনএসভিউতে একটি আলফা চ্যানেলের সাথে পটভূমি সেট করার বিষয়ে (যেমন আপনি এনএসওয়াইন্ডো দিয়ে করতে পারেন) - তবে আমি মনে করি যে অনেকগুলি রঙ এখানে কীভাবে সেট করবেন তা সন্ধান করতে এখানে আসেন (এভাবে প্রথম উত্তরটি আরও জনপ্রিয়)।
BadPirate

6

সুইফটে:

override func drawRect(dirtyRect: NSRect) {

    NSColor.greenColor().setFill()
    NSRectFill(dirtyRect)

    super.drawRect(dirtyRect)
}

5

আমাদের সহজে স্টাইল করার অনুমতি দেয় এনএসবক্স, যা এনএসভিউর একটি সাবক্লাস, সেগুলি ব্যবহার করুন

সুইফট 3

let box = NSBox()
box.boxType = .custom
box.fillColor = NSColor.red
box.cornerRadius = 5

এনএসবক্স এনএসপোভারের ক্ষেত্রে সহায়তা করে না কারণ এটিতে ত্রিভুজ অংশ রয়েছে।
আনাগশর্মা

5

সন্দেহ ছাড়াই সবচেয়ে সহজ উপায়, রঙ সেট সম্পদের সাথেও সামঞ্জস্যপূর্ণ:

দ্রুত :

view.setValue(NSColor.white, forKey: "backgroundColor")

উদ্দেশ্য-সি :

[view setValue: NSColor.whiteColor forKey: "backgroundColor"];

ইন্টারফেস নির্মাতা :

backgroundColorধরনের, ইন্টারফেস বিল্ডারে একটি ব্যবহারকারী সংজ্ঞায়িত বৈশিষ্ট্য যুক্ত করুন NSColor


এটি অননুমোদিত আচরণের উপর নির্ভর করে এবং যদি আপনি এখনও অ্যাপকিটের ভবিষ্যতের সংস্করণগুলিতে কাজ করতে চান তবে এড়ানো উচিত।
nschmidt

3

আমি নিম্নলিখিতটি পরীক্ষা করেছি এবং এটি আমার জন্য কাজ করেছে (সুইফটে):

view.wantsLayer = true
view.layer?.backgroundColor = NSColor.blackColor().colorWithAlphaComponent(0.5).CGColor

আপনি এটি করার পরে কি আপনার উপরে কোনও চিত্র রেখেছেন? অথবা আপনি কোনও এনএসআইমেজভিউয়ের পরিবর্তে কোনও এনএসভিউ ব্যবহার করেছেন?
জাস্ট কলবস

3

সুইফ্ট 3 এ আপনি এটি করার জন্য একটি এক্সটেনশন তৈরি করতে পারেন:

extension NSView {
    func setBackgroundColor(_ color: NSColor) {
        wantsLayer = true
        layer?.backgroundColor = color.cgColor
    }
}

// how to use
btn.setBackgroundColor(NSColor.gray)

1

কটাক্ষপাত আছে RMSkinnedView । আপনি ইন্টারফেস বিল্ডারের মধ্যে থেকে এনএসভিউয়ের পটভূমি রঙ সেট করতে পারেন।


1

দ্রুতগতিতে আপনি এনএসভিউ সাবক্লাস করতে পারেন এবং এটি করতে পারেন

class MyView:NSView {
    required init?(coder: NSCoder) {
        super.init(coder: coder);

        self.wantsLayer = true;
        self.layer?.backgroundColor = NSColor.redColor().CGColor;
    }
}

1
সুইফট 4.2 এক্সকোড 10 সেলফার্লেয়ার? ব্যাকগ্রাউন্ড কালার = এনএসকলার.রেড.গ্রাফিকাল
ব্রায়ান ক্লেয়ার

1

কেবলমাত্র ছোট পুনঃব্যবহারযোগ্য বর্গ (সুইফট ৪.১)

class View: NSView {

   var backgroundColor: NSColor?

   convenience init() {
      self.init(frame: NSRect())
   }

   override func draw(_ dirtyRect: NSRect) {
      if let backgroundColor = backgroundColor {
         backgroundColor.setFill()
         dirtyRect.fill()
      } else {
         super.draw(dirtyRect)
      }
   }
}

// Usage
let view = View()
view.backgroundColor = .white

1

মাত্র backgroundColorস্তরটিতে সেট করুন (ভিউ স্তরটিকে ব্যাক করার পরে)।

view.wantsLayer = true
view.layer?.backgroundColor = CGColor.white

0

এটি অ্যাপ্লিকেশন চলাকালীন সিস্টেমেড চেহারার পরিবর্তন (অন্ধকার মোড চালু বা বন্ধ) সমর্থন করে। আপনি ইন্টারফেস বিল্ডারে ব্যাকগ্রাউন্ড কালার সেট করতে পারেন, যদি আপনি ব্যাকগ্রাউন্ড কালারভিউতে ভিউয়ের ক্লাসটি সেট করেন।


class BackgroundColorView: NSView {
    @IBInspectable var backgroundColor: NSColor? {
        didSet { needsDisplay = true }
    }

    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        wantsLayer = true
    }

    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        wantsLayer = true
    }

    override var wantsUpdateLayer: Bool { return true }

    override func updateLayer() {
        layer?.backgroundColor = backgroundColor?.cgColor
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.