स्विफ्ट - टेक्स्ट की दो पंक्तियों के साथ यूब्यूटॉन


93

मैं सोच रहा था कि क्या पाठ की दो पंक्तियों के साथ एक UIButton बनाना संभव है। मैं एक अलग फ़ॉन्ट आकार के लिए प्रत्येक पंक्ति की जरूरत है। पहली पंक्ति 17 बिंदु और दूसरी 11 बिंदु होगी। मैं एक UIButton के अंदर दो लेबल लगाने के साथ खिलवाड़ करने की कोशिश की है, लेकिन मैं उन्हें बटन की सीमा के अंदर रहने के लिए नहीं मिल सकता।

मैं ui बिल्डर में यह सब करने का प्रयास कर रहा हूं, और प्रोग्रामिक रूप से नहीं।

धन्यवाद

जवाबों:


249

दो सवाल हैं।

मैं सोच रहा था कि क्या पाठ की दो पंक्तियों के साथ एक 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)

    }

उत्पादन

यहां छवि विवरण दर्ज करें


2
बहुत अच्छा काम करता है। मैं अब सोच रहा था कि क्या प्रत्येक पंक्ति पर पाठ को केंद्र में रखने का कोई तरीका है, और यदि दो पंक्तियों के बीच अधिक स्थान सम्मिलित करने का कोई तरीका है।
स्कॉट

3
आप केंद्र में दोनों पंक्ति पाठ संरेखित कर सकते हैं। निम्नलिखित कोड btnTwoLine; ?titleLabel? .textAlignment = NSTextAlignment.Center लिखें या स्टोरीबोर्ड फ़ाइल (नियंत्रण
अनुभाग-

क्या मुझे पता है कि बीच में और लाइनें डालने का उद्देश्य क्या है?
शम्सुद्दीन टीके

यह बटन के आकार पर निर्भर करता है। यदि बटन बड़ा है, तो पाठ की दो पंक्तियाँ ठीक बीच में जा रही हैं, जिसमें ऊपर और नीचे बहुत जगह है। यह वह नज़र नहीं है जिसके लिए मैं जा रहा था।
स्कॉट

यो को यहाँ कुछ ट्रिक लागू करने हैं :) आप कई लाइनों को बीच में लगा सकते हैं। मेरा मतलब है, "हैलो \ n \ n \ n" "आपको तीन स्थान देगा। हालाँकि, अपना कोड var newlineRange संशोधित करना न भूलें: NSRange = buttonText.rangeOfString ("\ 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)

12

मेरे पास अधिकांश समाधानों में एक समस्या है जो लाइन कैरेक्टर रैप को "कैरेक्टर रैप" बनाते समय दूसरी पंक्ति को पहली पंक्ति में संरेखित करती है।

सभी लाइनों को केंद्रित करने के लिए। बस शीर्षक को सादे से गुण में बदलें और फिर आप प्रत्येक पंक्ति को केंद्रित कर सकते हैं

केंद्रित शीर्षक


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)

2
यकीन नहीं क्यों, लेकिन मुझे बटन जोड़ना था। टाइटलेबेल? --numberOfLines = 0
budidino

पहले स्विफ्ट 4 में काम नहीं किया था। "वर्ड रैप" को "लाइन ब्रेक" सेट करने की आवश्यकता है। धन्यवाद आदमी :)
करण अलंगट

मूल पूर्व उत्तर नीचे है: stackoverflow.com/a/30679547/5318223
किरिल एस।

5

मैंने इसे ठीक कर दिया है और मेरा समाधान केवल स्टोरीबोर्ड में था।

परिवर्तन:

यह पहचान इंस्पेक्टर में जोड़ा गया -> उपयोगकर्ता परिभाषित रनटाइम एट्रिब्यूट्स (ये KeyPaths):

  • numberOfLines = 2
  • titleLab.textAlignment = 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

ऐसा करने का एक तरीका लेबल के साथ है, मुझे लगता है। मैंने ऐसा किया, और यह ठीक काम करने लगता है। मैं इसे UIButton के रूप में बना सकता हूं और फिर लेबल को प्रकट कर सकता हूं, मुझे लगता है। मुझे नहीं पता कि क्या इससे कोई मतलब है।

    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

जब मैं एक संग्रह दृश्य के अंदर एक उत्परिवर्ती बटन रखना चाहता था, तो दुर्भाग्य से सुझाए गए समाधान मेरे लिए कारगर नहीं थे। तब एक सहयोगी ने मुझे एक वर्कअराउंड दिखाया, जिसे मैं साझा करना चाहता था अगर किसी को एक ही समस्या है - आशा है कि यह मदद करता है! एक वर्ग बनाएं जो UIControl से विरासत में मिला है और इसे एक लेबल के साथ विस्तारित करें, जो बाद में एक बटन की तरह व्यवहार करेगा।

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")
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.