প্রোগ্রামিয়মে বাটন কীভাবে তৈরি করবেন?


256

আমি কীভাবে প্রোগ্রামে গ্রাফিকাল উপাদানগুলি (যেমন একটি UIButton) সুইফটে তৈরি করতে পারি ? আমি একটি ভিউতে বোতাম তৈরি এবং যুক্ত করার চেষ্টা করেছি, কিন্তু সক্ষম ছিলাম না।

উত্তর:


414

টার্গেটএকশনUIButton সহ একটি প্রোগ্রামগতভাবে যুক্ত করার জন্য এখানে একটি সম্পূর্ণ সমাধান । সুইফট 2.2

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .greenColor()
  button.setTitle("Test Button", forState: .Normal)
  button.addTarget(self, action: #selector(buttonAction), forControlEvents: .TouchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

প্রতিটি আইফোন স্ক্রিনের জন্য বোতামটি সঠিকভাবে NSLayoutConstraintরাখার চেয়ে ব্যবহার করা ভাল frame

সুইট ৩.১ এ আপডেট হওয়া কোড :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

সুইট ৪.২ এ আপডেট হওয়া কোড :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

@objc func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

উপরোক্ত এখনও func buttonActionঘোষিত privateবা যদি কাজ করে internal


3
এবং ভুলে যাবেন না যে আপনার টার্গেট ক্লাসটি এনএসবজেক্ট থেকে নেওয়া উচিত
আলেক্সি গ্লোবচাস্টি

7
এবং ভুলে যাবেন না যে আপনার ক্রিয়াটি ফাংশনটি ব্যক্তিগত হতে পারে না
পাবলো জবিগি জাবলোনস্কি

2
এটি অদ্ভুত যে তারা কোনও ফাংশন ব্যবহার না করে স্ট্রিংয়ের সাথে ক্রিয়া করার সিদ্ধান্ত নিয়েছে (স্ট্রিং সহ এটি নির্বাচকদের চেয়ে আরও বেশি সুরক্ষিত!)।
ওবজে

একটি বোতাম কোণার ব্যাসার্ধ পরিবর্তন করার কোনও উপায় আছে?
মোরালকোড

3
সুইফ্ট ১.২ হিসাবে ডাউনকাস্টগুলি আর "হিসাবে" দিয়ে করা যাবে না, তাদের অবশ্যই "জোর করেই উপযুক্ত" থাকতে হবে!
টেনাসিয়াসজয়

100

আপনি ইউআইবাটন, ইউআইলেবল এবং ইউআইটিেক্সটফিল্ড এইভাবে প্রোগ্রামে যুক্ত করতে পারেন।

ইউআইবাটন কোড

// var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
let button = UIButton(type: .System) // let preferred over var here
button.frame = CGRectMake(100, 100, 100, 50)
button.backgroundColor = UIColor.greenColor()
button.setTitle("Button", forState: UIControlState.Normal)
button.addTarget(self, action: "Action:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)

ইউআইএলবেল কোড

var label: UILabel = UILabel()
label.frame = CGRectMake(50, 50, 200, 21)
label.backgroundColor = UIColor.blackColor()
label.textColor = UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
self.view.addSubview(label)

ইউআইটিেক্সটফিল্ড কোড

var txtField: UITextField = UITextField()
txtField.frame = CGRectMake(50, 70, 200, 30)
txtField.backgroundColor = UIColor.grayColor()
self.view.addSubview(txtField)

আশা করি এটি আপনার জন্য সহায়ক।


সুতরাং, আপনি ইউআইবাটন এর আগে ভাগ করা কোডের প্রথম লাইনে "হিসাবে" অপারেটরের প্রয়োজন কেন ...?
জুমজুম

বাটনউইথটাইপটি যেকোনওজেক্ট টাইপ করে, তাই আপনাকে এটি ইউআইবাটন হিসাবে কাস্ট করতে হবে
ক্রিস সি

1
@ এলজসকিউনচেন আপনি আপনার প্রয়োজন অনুসারে এই কোডটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ আপনি যখন ভিউ উইল অ্যাপয়ারে কোড যুক্ত করবেন তখন আপনি একটি ইউআইবাটন যুক্ত করতে চান।
আক্তার

1
সুইফ্ট ১.২ হিসাবে ডাউনকাস্টগুলি আর "হিসাবে" দিয়ে করা যাবে না, তাদের অবশ্যই "জোর করেই উপযুক্ত" থাকতে হবে!
টেনাসিয়াসজয়

যারা উদ্দেশ্য সি স্ট্রিং অবচিত সতর্কবার্তা লিটারেল মধ্যে চালানো জন্য সঠিক উত্তরটি এখানে: stackoverflow.com/a/36308587/968848
n.by.n

61

সুইফট 3 এর জন্য

let button = UIButton()
button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
button.backgroundColor = UIColor.red
button.setTitle("your Button Name", for: .normal)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)

func buttonAction(sender: UIButton!) {
    print("Button tapped")
}

সুইফট 4 এর জন্য

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

 @objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
 }

button.frame = (frame: CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50))হওয়া উচিতbutton.frame = CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50)
জে সি

2
সুইফট 4-এ "ফানক" এর আগে "@objc" যুক্ত করা দরকার।
রুসলান লেশচেঙ্কো

29

সুইফট 3

let btn = UIButton(type: .custom) as UIButton
btn.backgroundColor = .blue
btn.setTitle("Button", for: .normal)
btn.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
btn.addTarget(self, action: #selector(clickMe), for: .touchUpInside)
self.view.addSubview(btn)

func clickMe(sender:UIButton!) {
  print("Button Clicked")
}

আউটপুট

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


ধন্যবাদ, এম 8! আজই সুইফ্টের সাথে শুরু করুন যাতে সবকিছু একরকম অদ্ভুত (:
ফিলিপ

17

সুইফট ৩.০ ব্যবহার করে এটি কীভাবে করবেন ।

func createButton() {
    let button = UIButton(type: .system)
    button.frame = CGRect(x: 100.0, y: 100.0, width: 100.0, height: 100.0)
    button.setTitle(NSLocalizedString("Button", comment: "Button"), for: .normal)
    button.backgroundColor = .green
    button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)
    view.addSubview(button)
}

@objc func buttonAction(sender: UIButton) {
    print("Button pushed")
}

16
 var sampleButton:UIButton?

 override func viewDidLoad() {
  super.viewDidLoad()

 }
 override func viewDidAppear(animated: Bool) {

  sampleButton = UIButton(type: .RoundedRect)
  //sampleButton.frame = CGRect(x:50, y:500, width:70, height:50)

  sampleButton!.setTitle("Sample \n UI Button", forState: .Normal)
  sampleButton!.titleLabel?.lineBreakMode = .ByWordWrapping
  sampleButton!.titleLabel?.textAlignment = .Center
  sampleButton!.setTitleColor(UIColor.whiteColor(), forState: .Normal)
  sampleButton!.layer.cornerRadius = 6
  sampleButton!.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.6)
  sampleButton?.tintColor =  UIColor.brownColor()


  //Add padding around text
  sampleButton!.titleEdgeInsets = UIEdgeInsetsMake(-10,-10,-10,-10)
  sampleButton!.contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5)

  //Action set up
  sampleButton!.addTarget(self, action: "sampleButtonClicked", forControlEvents: .TouchUpInside)
  self.view.addSubview(sampleButton!)


  //Button Constraints:
  sampleButton!.translatesAutoresizingMaskIntoConstraints = false

  //To anchor above the tab bar on the bottom of the screen:
  let bottomButtonConstraint = sampleButton!.bottomAnchor.constraintEqualToAnchor(bottomLayoutGuide.topAnchor, constant: -20)

  //edge of the screen in InterfaceBuilder:
  let margins = view.layoutMarginsGuide
  let leadingButtonConstraint = sampleButton!.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)

  bottomButtonConstraint.active = true
  leadingButtonConstraint.active = true


 }
 func sampleButtonClicked(){

  print("sample Button Clicked")

 }

14

এপিআই পরিবর্তন হয়নি - কেবল বাক্য গঠন রয়েছে। আপনি এটি তৈরি করতে UIButtonএবং এটিকে যুক্ত করতে পারেন:

var button = UIButton(frame: CGRectMake(0, 0, 50, 50))
self.view.addSubview(button) // assuming you're in a view controller

7

আপনি এটির মতো তৈরি করতে পারেন এবং আপনি এর মতো ক্রিয়াও যুক্ত করতে পারেন ....

import UIKit

let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))

init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
{       super.init(nibName: nibName, bundle: nibBundle) 
        myButton.targetForAction("tappedButton:", withSender: self)
}

func tappedButton(sender: UIButton!)
{ 
     println("tapped button")
}

দুঃখিত, তবে সংকলকটি লাইনে ত্রুটি পাঠিয়েছে - self.view.addSubview (দেখুন: মাইবাটন)। ত্রুটিটি পরবর্তী: "বহির্মুখী আর্গুমেন্ট লেবেল 'ভিউ:' কল ইন"
ভাল_লেক

দয়া করে এই লাইনটি স্ব.উইউ.ভিউ.এডিডিউবউভিউটি দেখুন (দেখুন: আমারবাটন) আরও তথ্যের জন্য আমার সম্পাদিত উত্তরটি দেখুন।
ধর্মবীর সিং

আপনাকে ধন্যবাদ, তবে আমি কীভাবে স্ব.ভিউতে এই বোতামটি যুক্ত করতে পারি?
ভাল_লেক

6

এই কোডটি ভিডডিওডে যুক্ত করুন
// বোতাম যুক্ত করুন

            var button=UIButton(frame: CGRectMake(150, 240, 75, 30))
            button.setTitle("Next", forState: UIControlState.Normal)
            button.addTarget(self, action: "buttonTapAction:", forControlEvents: UIControlEvents.TouchUpInside)
            button.backgroundColor = UIColor.greenColor()
            self.view.addSubview(button)

এর বাইরে এই ফাংশনটি লিখুন, আপনি বোতামে টিপলে এটি কল করবে

func buttonTapAction(sender:UIButton!)
{
    println("Button is working")
}

6

সুইফট 2 এবং আইওএস 9.2.1 এ

var button: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
self.button.frame = CGRectMake(130, 70, 60, 20)
self.button.setTitle("custom button", forState: UIControlState.Normal)
self.button.addTarget(self, action:"buttonActionFuncName", forControlEvents: UIControlEvents.TouchUpInside)
self.button.setTitleColor(UIColor.blackColor(), forState: .Normal)
self.button.layer.borderColor = UIColor.blackColor().CGColor
self.button.titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 13)
self.view.addSubview(self.button)

6

সুইফট 5 এর জন্য সুইফট 4 এর মতোই

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

 @objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
 }

4

এটা সম্ভব. আপনি সুইফট সিনট্যাক্স ব্যবহার বাদে বেশ কিছু একইভাবে করেন। উদাহরণস্বরূপ আপনি এই জাতীয় কোডটিতে একটি ইউআইবাটন তৈরি করতে পারেন:

 var button: UIButton = UIButton(frame: CGRectMake(0, 0, 100, 100))

3

স্টোরিবোর্ড থেকে ইউআইবাটন তৈরি করার জন্য: ১ - স্টোরিবোর্ড ফাইলটিতে অবজেক্ট লাইব্রেরি থেকে ভিউ কন্ট্রোলারে ইউআইবাটনের অবজেক্টটি টেনে আনুন - সহকারী সম্পাদক 3 দেখান - উপরে আপনার ক্লাসে তৈরি ইউআইবাটন থেকে ডান ক্লিক দিয়ে টেনে আনুন। ফলাফল নিম্নলিখিত:

@IBAction func buttonActionFromStoryboard(sender: UIButton)
{
    println("Button Action From Storyboard")
}

প্রোগ্রামিয়ালি ইউআইবাটন তৈরি করার জন্য: 1- "ওভাররাইড ফানক ভিউডিডলড ()" তে লিখুন:

        let uiButton    = UIButton.buttonWithType(UIButtonType.System) as UIButton
        uiButton.frame  = CGRectMake(16, 116, 288, 30)
        uiButton.setTitle("Second", forState: UIControlState.Normal);
        uiButton.addTarget(self, action: "buttonActionFromCode:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(uiButton)

2- আইবিএ ফাংশন যুক্ত করুন:

@IBAction func buttonActionFromCode(sender:UIButton)
{
    println("Button Action From Code")
}

সুইফ্ট ১.২ হিসাবে ডাউনকাস্টগুলি আর "হিসাবে" দিয়ে করা যাবে না, তাদের অবশ্যই "জোর করেই উপযুক্ত" থাকতে হবে!
টেনাসিয়াসজয়

3
            let myFirstButton = UIButton()
            myFirstButton.setTitle("Software Button", forState: .Normal)
            myFirstButton.setTitleColor(UIColor.redColor(), forState: .Normal)
            myFirstButton.frame = CGRectMake(100, 300, 150, 50)
            myFirstButton.backgroundColor = UIColor.purpleColor()
            myFirstButton.layer.cornerRadius = 14
            myFirstButton.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)
            self.view.addSubview(myFirstButton)
            myFirstButton.hidden=true
            nameText.delegate = self


func pressed(sender: UIButton!) {
        var alertView = UIAlertView()
        alertView.addButtonWithTitle("Ok")
        alertView.title = "title"
        alertView.message = "message"
        alertView.show();
    }

3

হ্যাঁ সিমুলেটারে। কিছু সময় এটি নির্বাচককে স্বীকৃতি দেয় না এমন একটি বাগ রয়েছে বলে মনে হয়। এমনকি আমি আপনার কোডটির জন্য মুখোমুখি হইনি, তবে আমি সবেমাত্র ক্রিয়াকলাপের নাম (নির্বাচক) পরিবর্তন করেছি। এটা কাজ করে

let buttonPuzzle:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50))
buttonPuzzle.backgroundColor = UIColor.greenColor()
buttonPuzzle.setTitle("Puzzle", forState: UIControlState.Normal)
buttonPuzzle.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
buttonPuzzle.tag = 22;
self.view.addSubview(buttonPuzzle)

নির্বাচক কাজ এখানে:

func buttonAction(sender:UIButton!)
{

    var btnsendtag:UIButton = sender
    if btnsendtag.tag == 22 {            
        //println("Button tapped tag 22")
    }
}

দেখে মনে হচ্ছে আমি একই সমস্যাটিতে চলেছি। আমি প্রথমে স্টোরিবোর্ডে বোতামটি আইবিএএকশন তৈরি করেছি, তবে আমি "উদাহরণ স্বীকৃত নির্বাচককে প্রেরণ করা" পেয়েছি, তারপরে আমি আইবিএक्शनটি সেইভাবে তৈরি করে মুছে ফেলেছি এবং .এডিডিআরজেট ব্যবহার করার চেষ্টা করেছি, তারা উভয়ই একই ত্রুটির দিকে পরিচালিত করে।
রায়আইনওয়েল

আমার পক্ষে কাজটি হ'ল .swift ফাইলের সমস্ত IBOutlet এবং IBAction কোড এবং ইন্টারফেসবিল্ডারের সমস্ত সংযোগ মুছে ফেলা। তারপরে সবকিছু পুনরায় তৈরি করা।
রায়ইননিল

2

এটি আমার পক্ষে খুব কার্যকরভাবে কাজ করে, # ডায়নামিকবাটন এভেন্ট # আইওএস # সুইফট # এক্সকোড

func setupButtonMap(){
    let mapButton = UIButton(type: .system)
    mapButton.setImage(#imageLiteral(resourceName: "CreateTrip").withRenderingMode(.alwaysOriginal), for: .normal)
    mapButton.frame = CGRect(x: 0, y: 0, width: 34, height: 34)
    mapButton.contentMode = .scaleAspectFit
    mapButton.backgroundColor = UIColor.clear
    mapButton.addTarget(self, action: #selector(ViewController.btnOpenMap(_:)), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: mapButton)
    }
@IBAction func btnOpenMap(_ sender: Any?) {
    print("Successful")
}

2

বাটন প্রোগ্রাম্যাটিকভাবে যুক্ত করার জন্য এই নমুনা কোডটি 4.2 সুইফটে লিখুন।

override func viewDidLoad() {
    super.viewDidLoad()
        let myButton = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        myButton.backgroundColor = .green
        myButton.setTitle("Hello UIButton", for: .normal)
        myButton.addTarget(self, action: #selector(myButtonAction), for: .touchUpInside)
        self.view.addSubview(myButton)
}

 @objc func myButtonAction(sender: UIButton!) {
    print("My Button tapped")
}

1
    // UILabel:
    let label = UILabel()
    label.frame = CGRectMake(35, 100, 250, 30)
    label.textColor = UIColor.blackColor()
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    self.view.addSubview(label)

    // UIButton:
    let btn: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
    btn.frame = CGRectMake(130, 70, 60, 20)
    btn.setTitle("Click", forState: UIControlState.Normal)
    btn.setTitleColor(UIColor.blackColor(), forState: .Normal)
    btn.addTarget(self, action:Selector("clickAction"), forControlEvents: UIControlEvents.TouchUpInside)
    view.addSubview(btn)


    // Button Action:
    @IBAction func clickAction(sender:AnyObject)
    {
        print("Click Action")
    }

1

পদক্ষেপ 1: একটি নতুন প্রকল্প করুন

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

পদক্ষেপ 2: ভিউকন্ট্রোলআর সুইফটে in

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CODE
        let btn = UIButton(type: UIButtonType.System) as UIButton        
        btn.backgroundColor = UIColor.blueColor()
        btn.setTitle("CALL TPT AGENT", forState: UIControlState.Normal)
        btn.frame = CGRectMake(100, 100, 200, 100)
        btn.addTarget(self, action: "clickMe:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)

    }

    func clickMe(sender:UIButton!) {
      print("CALL")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

0

সুইফট: ইউআই বাটন প্রোগ্রামগতভাবে তৈরি করে

let myButton = UIButton()

myButton.titleLabel!.frame = CGRectMake(15, 54, 300, 500)
myButton.titleLabel!.text = "Button Label"
myButton.titleLabel!.textColor = UIColor.redColor()
myButton.titleLabel!.textAlignment = .Center
self.view.addSubview(myButton)

0

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

 func viewDidLoad(){
                    saveActionButton = UIButton(frame: CGRect(x: self.view.frame.size.width - 60, y: 0, width: 50, height: 50))
                    self.saveActionButton.backgroundColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 0.7)
                    saveActionButton.addTarget(self, action: #selector(doneAction), for: .touchUpInside)
                    self.saveActionButton.setTitle("Done", for: .normal)
                    self.saveActionButton.layer.cornerRadius = self.saveActionButton.frame.size.width / 2
                    self.saveActionButton.layer.borderColor = UIColor.darkGray.cgColor
                    self.saveActionButton.layer.borderWidth = 1
                    self.saveActionButton.center.y = self.view.frame.size.height - 80
                    self.view.addSubview(saveActionButton)
        }

          func doneAction(){
          print("Write your own logic")
         }

0

আমি সাধারণত সেটআপে ইউআইবোটনের এক্সটেনশনে যাই। সুইফট 5।

let button: UIButton = UIButton()
override func viewDidLoad() {
        super.viewDidLoad()
     button.setup(title: "OK", x: 100, y: 430, width: 220, height: 80, color: .yellow)
        buttonD.setTitleColor(.black, for: .normal)

}
extension UIButton {
    func setup(title: String, x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: UIColor){
        frame = CGRect(x: x, y: y, width: width, height: height)
        backgroundColor = color
        setTitle(title , for: .normal) 
        }
    }

-1
Uilabel code 

var label: UILabel = UILabel()
label.frame = CGRectMake(50, 50, 200, 21)
label.backgroundColor = UIColor.blackColor()
label.textColor = UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
self.view.addSubview(label)

2
এটি সর্বদা আপনার
কোডটিতে

-2
override func viewDidLoad() {

super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var imageView = UIImageView(frame: CGRectMake(100, 150, 150, 150));
    var image = UIImage(named: "BattleMapSplashScreen.png");
    imageView.image = image;
    self.view.addSubview(imageView);

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.