দুটি লাইনের পাঠ্য সহ সুইফট - ইউআইবাটন


95

আমি ভাবছিলাম যে দুটি লাইনের পাঠ্য সহ একটি ইউআইবাটন তৈরি করা সম্ভব কিনা। আমার প্রতিটি লাইন আলাদা ফন্টের আকারের প্রয়োজন। প্রথম লাইনটি 17 পয়েন্ট এবং দ্বিতীয়টি হবে 11 পয়েন্টের। আমি একটি ইউআইবাটনটির ভিতরে দুটি লেবেল রেখে গণ্ডগোলের চেষ্টা করেছি, তবে আমি সেগুলি বোতামের সীমানার ভিতরে থাকতে পারি না।

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

ধন্যবাদ

উত্তর:


253

দুটি প্রশ্ন আছে।

আমি ভাবছিলাম যে দুটি লাইনের পাঠ্য সহ একটি ইউআইবাটন তৈরি করা সম্ভব কিনা

স্টোরিবোর্ড বা প্রোগ্রামগতভাবে ব্যবহারের মাধ্যমে এটি সম্ভব।

স্টোরিবোর্ড:

চরিত্রের মোড়ক বা শব্দ মোড়ানোতে 'লাইন ব্রেক মোড' পরিবর্তন করুন এবং UIButton শিরোনাম ক্ষেত্রে নতুন লাইন প্রবেশ করতে Alt / Option + enter কী ব্যবহার করুন

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

প্রোগ্রামগতভাবে:

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;
}

আমার প্রতিটি লাইনের একটি আলাদা ফন্টের আকার 1 প্রয়োজন

সবচেয়ে খারাপ ক্ষেত্রেটি হল, আপনি একটি কাস্টম UIButtonক্লাস ব্যবহার করতে পারেন এবং এর মধ্যে দুটি লেবেল যুক্ত করতে পারেন ।

আরও ভাল উপায়, ব্যবহার করুন NSMutableAttributedString। মনে রাখবেন, এটি কেবল প্রোগ্রামগতভাবেই অর্জন করা যায়।

সুইফট 5:

@IBOutlet weak var btnTwoLine: UIButton?

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    //applying the line break mode
    textResponseButton?.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping;
    let buttonText: NSString = "hello\nthere"

    //getting the range to separate the button title strings
    let newlineRange: NSRange = buttonText.range(of: "\n")

    //getting both substrings
    var substring1 = ""
    var substring2 = ""

    if(newlineRange.location != NSNotFound) {
        substring1 = buttonText.substring(to: newlineRange.location)
        substring2 = buttonText.substring(from: newlineRange.location)
    }

    //assigning diffrent fonts to both substrings
    let font1: UIFont = UIFont(name: "Arial", size: 17.0)!
    let attributes1 = [NSMutableAttributedString.Key.font: font1]
    let attrString1 = NSMutableAttributedString(string: substring1, attributes: attributes1)

    let font2: UIFont = UIFont(name: "Arial", size: 11.0)!
    let attributes2 = [NSMutableAttributedString.Key.font: font2]
    let attrString2 = NSMutableAttributedString(string: substring2, attributes: attributes2)

    //appending both attributed strings
    attrString1.append(attrString2)

    //assigning the resultant attributed strings to the button
    textResponseButton?.setAttributedTitle(attrString1, for: [])
}

পুরানো সুইফট

@IBOutlet weak var btnTwoLine: UIButton?

override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        //applying the line break mode
        btnTwoLine?.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping;

        var buttonText: NSString = "hello\nthere"

        //getting the range to separate the button title strings
        var newlineRange: NSRange = buttonText.rangeOfString("\n")

        //getting both substrings
        var substring1: NSString = ""
        var substring2: NSString = ""

        if(newlineRange.location != NSNotFound) {
            substring1 = buttonText.substringToIndex(newlineRange.location)
            substring2 = buttonText.substringFromIndex(newlineRange.location)
        }

        //assigning diffrent fonts to both substrings
        let font:UIFont? = UIFont(name: "Arial", size: 17.0)
        let attrString = NSMutableAttributedString(
            string: substring1 as String,
            attributes: NSDictionary(
                object: font!,
                forKey: NSFontAttributeName) as [NSObject : AnyObject])

        let font1:UIFont? = UIFont(name: "Arial", size: 11.0)
        let attrString1 = NSMutableAttributedString(
            string: substring2 as String,
            attributes: NSDictionary(
                object: font1!,
                forKey: NSFontAttributeName) as [NSObject : AnyObject])

        //appending both attributed strings
        attrString.appendAttributedString(attrString1)

        //assigning the resultant attributed strings to the button
        btnTwoLine?.setAttributedTitle(attrString, forState: UIControlState.Normal)

    }

আউটপুট

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


4
দুর্দান্ত কাজ করে। আমি এখন ভাবছি যে প্রতিটি লাইনে পাঠ্যকে কেন্দ্র করার কোনও উপায় আছে এবং যদি দুটি লাইনের মধ্যে আরও স্থান সন্নিবেশ করার কোনও উপায় থাকে তবে।
স্কট

4
আপনি উভয় লাইনের পাঠ্যকে কেন্দ্র করে প্রান্তিক করতে পারেন। নিম্নলিখিত কোডটি লিখুন বিটিএনটিওলাইন? .TitleLabel? .textAlignment = NSTextAlignment.Center বা স্টোরিবোর্ড ফাইলটি ব্যবহার করুন (নিয়ন্ত্রণ
বিভাগ-

আমি জানতে পারি যে এর মধ্যে আরও লাইন স্থাপনের উদ্দেশ্য কী?
শামসুদ্দিন টি কে

এটি বোতামের আকারের উপর নির্ভর করে। বোতামটি যদি বড় হয় তবে উপরের এবং নীচে অনেকগুলি স্থান সহ পাঠ্যের দুটি লাইন ঠিক মাঝখানে হতে চলেছে। আমি যে চেহারাটি খুঁজছিলাম তা নয় not
স্কট

yo কে এখানে কিছু কৌশল প্রয়োগ করতে হবে :) আপনি একাধিক ব্যবহারের মধ্যে আরও লাইন রাখতে পারেন। n। আমার অর্থ, "হ্যালো \ n \ n here n এখানে" আপনাকে তিনটি স্থান দেবে। তবে আপনার কোডটি নতুন রূপরেঞ্জি পরিবর্তন করতে ভুলবেন না রেঞ্জ: এনএসআরঞ্জ = বাটনটেক্সট.রেঞ্জ অফফ্রিং ("\ n \ n \ n")
শামসুদ্দিন টি কে

22

আমি প্রায় একই বিষয় খুঁজছিলাম, আমার দুটি ভিন্ন ফন্টের আকারের প্রয়োজন নেই। যদি কেউ একটি সহজ সমাধান খুঁজছেন:

    let button = UIButton()
    button.titleLabel?.numberOfLines = 0
    button.titleLabel?.lineBreakMode = .byWordWrapping
    button.setTitle("Foo\nBar", for: .normal)
    button.titleLabel?.textAlignment = .center
    button.sizeToFit()
    button.addTarget(self, action: #selector(rightBarButtonTapped), for: .allEvents)
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)

13

আমি বেশিরভাগ সমাধানগুলিতে একটি বিষয় লক্ষ্য করেছি যা যা "চরিত্রের মোড়কে" রেখার বিরতি মোড তৈরি করার সময় দ্বিতীয় লাইনটি প্রথম লাইনে সারিবদ্ধ হবে

সমস্ত লাইন কেন্দ্রিক করা। কেবল শিরোনামটি সরল থেকে বৈশিষ্ট্যযুক্ততে পরিবর্তন করুন এবং তারপরে আপনি প্রতিটি লাইনকে কেন্দ্রিক করতে পারবেন

কেন্দ্রিক শিরোনাম


6

লাইন বিরতি চরিত্রের মোড়কে পরিবর্তন করুন, আপনার বোতামটি নির্বাচন করুন এবং অ্যাট্রিবিউট ইনস্পেক্টর লাইন ব্রেকে যান এবং এটিকে অক্ষর মোড়কে পরিবর্তন করুন

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


6

সুইট 3 সিনট্যাক্স

let str = NSMutableAttributedString(string: "First line\nSecond Line")
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 17), range: NSMakeRange(0, 10))
str.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 12), range: NSMakeRange(11, 11))
button.setAttributedTitle(str, for: .normal)

4
নিশ্চিত না কেন, কিন্তু আমি ছিল যোগ করার জন্য button.titleLabel .numberOfLines = 0?
budidino

প্রথমে সুইফট 4 এ কাজ করেনি। "লাইন ব্রেক" সেট করতে হবে "শব্দ মোড়ানো" rap ধন্যবাদ মানুষ :)
করণ আলাঙ্গাত

মূল পূর্বের উত্তরটি নীচে: stackoverflow.com/a/30679547/5318223
কিরিল এস

5

আমি এটি স্থির করেছি এবং আমার সমাধানটি কেবল স্টোরিবোর্ডে ছিল।

পরিবর্তনগুলি:

এটি পরিচয় পরিদর্শক -> ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যগুলিতে (এই কীপ্যাথগুলি) যুক্ত হয়েছে:

  • সংখ্যা অফলাইনস = 2
  • শিরোনামলাবেল.টেক্সটএলাইনমেন্ট = 1

ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য

আমি এটি বৈশিষ্ট্য পরিদর্শকটিতে যুক্ত করেছি:

  • লাইন বিরতি = শব্দ মোড়ানো

শব্দ মোড়ানো


2

কোডে আপনাকে এর কিছু করা দরকার। আপনি আইবিতে 2 টি ভিন্ন ফন্ট সেট করতে পারবেন না। লাইন ব্রেক ব্রেক মোডকে চরিত্রের মোড়কে পরিবর্তন করার পাশাপাশি শিরোনাম সেট করতে আপনার এর মতো কিছু দরকার,

override func viewDidLoad() {
        super.viewDidLoad()
        var str = NSMutableAttributedString(string: "First line\nSecond Line")
        str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(17), range: NSMakeRange(0, 10))
        str.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(12), range: NSMakeRange(11, 11))
        button.setAttributedTitle(str, forState: .Normal)

    }

1

এটি করার একটি উপায় হ'ল লেবেলগুলি সহ, আমার ধারণা। আমি এটি করেছি, এবং এটি ঠিক আছে বলে মনে হচ্ছে। আমি এটি একটি ইউআইবাটন হিসাবে তৈরি করতে এবং তারপরে লেবেলগুলি প্রকাশ করতে পারতাম বলে আমার ধারণা। আমি জানি না এটি কোনও অর্থবোধ করে কিনা।

    let firstLabel = UILabel()

    firstLabel.backgroundColor = UIColor.lightGrayColor()
    firstLabel.text = "Hi"
    firstLabel.textColor = UIColor.blueColor()
    firstLabel.textAlignment = NSTextAlignment.Center
    firstLabel.frame = CGRectMake(0, testButton.frame.height * 0.25, testButton.frame.width, testButton.frame.height * 0.2)
    testButton.addSubview(firstLabel)

    let secondLabel = UILabel()

    secondLabel.backgroundColor = UIColor.lightGrayColor()
    secondLabel.textColor = UIColor.blueColor()
    secondLabel.font = UIFont(name: "Arial", size: 12)
    secondLabel.text = "There"
    secondLabel.textAlignment = NSTextAlignment.Center
    secondLabel.frame = CGRectMake(0, testButton.frame.height * 0.5, testButton.frame.width, testButton.frame.height * 0.2)
    testButton.addSubview(secondLabel)

0

আমার পথ:

func setButtonTitle(title: String, subtitle: String, button: UIButton){
        //applying the line break mode
        button.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping;
        let title = NSMutableAttributedString(string: title, attributes: Attributes.biggestLabel)
        let subtitle = NSMutableAttributedString(string: subtitle, attributes: Attributes.label)
        let char = NSMutableAttributedString(string: "\n", attributes: Attributes.biggestLabel)
        title.append(char)
        title.append(subtitle)
        button.setAttributedTitle(title, for: .normal)
    }

0

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

class MultilineButton: UIControl {

    let label: UILabel = {
        $0.translatesAutoresizingMaskIntoConstraints = false
        $0.numberOfLines = 0
        $0.textAlignment = .center
        return $0
    }(UILabel())

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(label)

        NSLayoutConstraint.activate([
            label.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor),
            label.trailingAnchor.constraint(equalTo: layoutMarginsGuide.trailingAnchor),
            label.topAnchor.constraint(equalTo: layoutMarginsGuide.topAnchor),
            label.bottomAnchor.constraint(equalTo: layoutMarginsGuide.bottomAnchor)
        ])
    }

    override var isHighlighted: Bool {
        didSet {
            backgroundColor = backgroundColor?.withAlphaComponent(isHighlighted ? 0.7 : 1.0)
            label.textColor = label.textColor.withAlphaComponent(isHighlighted ? 0.7 : 1.0)
        }
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.