UIButton फ़ॉन्ट आकार को चौड़ाई में समायोजित करें


122

मेरे पास निम्नलिखित कोड हैं:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);

[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];

[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];

मुद्दा यह है कि जब पाठ में स्ट्रिंग लंबी नहीं होती है, तो यह ठीक दिखाता है (1-2 अंक)। हालांकि, जब यह काफी लंबा (3 ++ अंक) है, तो मैं देख सकता हूं कि एक लाल बटन है, जिसमें कोई पाठ नहीं है। मैं इसे कैसे समायोजित करूं?

मुझे नहीं लगता कि:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];

काम करता है, है ना?


यह काम करना चाहिए, या Label.adjustsFontSizeToFitWidth = YES।
ल्यूक

यह द्वारा काम करता हैtitleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133

जवाबों:


291

इसे इस्तेमाल करे:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

मुझे यकीन नहीं है कि यह चाल क्यों करता है लेकिन यह करता है :)


1
धन्यवाद, जबकि button.titleLabel.lineBreakMode = UILineBreakModeClip; <- मैजिक लाइन अब
अपदस्थ है

8
@ यूनाईटेड UILineBreakModeClip को NSLineBreakByClipping के साथ बदलें
CodeR सस्ता

1
एनवीएम, जिसने बस इसे numberOfLines0
मार्टी

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

यदि आप ऑटो-लेआउट का उपयोग कर रहे हैं और बटन की चौड़ाई पर एक बाधा निर्धारित की है, तो यह अपने आप ही काम करना चाहिए ।

अन्य विकल्प (न्यूनतम स्केल फैक्टर, लाइनों की संख्या आदि) का उपयोग अभी भी आपकी आवश्यकताओं के अनुसार अनुकूलित करने के लिए किया जा सकता है, लेकिन इसकी आवश्यकता नहीं है।


15

EliBud का उत्तर iOS 8 पर काम नहीं करता है। मुझे एक समाधान मिला जो iOS 8 पर काम करता है। नीचे एक स्विफ्ट कोड है:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

आप लेबल के साथ खेल सकते हैं। लाइनब्रीकमोड जैसा कि मैंने पाया कि परिणाम अलग-अलग ब्रेक मोड के लिए भिन्न होते हैं।


.adjustsFontSizeToFitWidth = true - मैं NSTextField और resizable विंडो के साथ कैसे कर सकता हूं?
सिंह डेब्यू

यह मुझे उसी तरह दिखता है जैसे कि Xcode IB का चयन लेबल का उपयोग करके और इसे न्यूनतम फ़ॉन्ट स्केल से 0.01 पर सेट करना है
लियो डबस


UITextField में टेक्स्ट को ऑटो सिकोड़ने का विकल्प है, जबकि NSTextField नहीं है। इसलिए मुझे लगता है कि आपको टेक्स्ट फ़ील्ड की चौड़ाई के अनुसार फ़ॉन्ट को मैन्युअल रूप से समायोजित करने की आवश्यकता है।
अलेक्जेंडर बिल्लावस्किी

10

नवीनतम तेजी से यह मेरे लिए काम करने लगता है

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

10

अन्य उत्तरों के आधार पर iOS 10.3 समाधान:

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters

किसी ने baselineAdjustmentअभी तक उल्लेख नहीं किया है; मुझे इसकी आवश्यकता थी क्योंकि adjustsFontSizeToFitWidthप्रभावी होने के बाद बटन लेबल लंबवत रूप से गलत हो जाता है। Apple का baselineAdjustmentप्रलेखन:

यदि adjustsFontSizeToFitWidthसंपत्ति सेट की जाती है true, तो यह संपत्ति उन स्थितियों में टेक्स्ट बेसलाइन के व्यवहार को नियंत्रित करती है जहां फ़ॉन्ट आकार के समायोजन की आवश्यकता होती है। इस संपत्ति का डिफ़ॉल्ट मान है alignBaselines। यह प्रॉपर्टी तभी प्रभावी होती है जब numberOfLinesप्रॉपर्टी सेट की जाती है 1


एफडब्ल्यूआईडब्ल्यू, मैं कभी भी लेबल को पूरी तरह से गठबंधन नहीं कर सका।


8

adjustsFontSizeToFitWidth मेरे लिए तब तक काम नहीं कर रहा था जब तक कि मैं इंटरफ़ेस बिल्डर में अपने बटन पर एक चौड़ाई की बाधा नहीं डालता।

अड़चन स्थापित करने से बटन आकार में बढ़ने से बचा रहा और इसलिए यह महसूस नहीं हुआ कि इसे पाठ को सिकोड़ना था।


8

स्विफ्ट 4 एक्सटेंशन

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters 
        }
    }
}

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


क्या आप यू टैग का उपयोग करते हैं?
ज़ापोरोज़ेन्को ऑलेक्ज़ेंडर

गटर बनाने के लिए उपलब्ध होने के लिए
निक कोव

क्या आप अधिक गहराई से बता सकते हैं कि आपका क्या मतलब है?
ज़ापोरोज़ेन्को ऑलेक्ज़ेंडर

समायोजन को सक्षम करने के लिए मैं एक ध्वज की तरह टैग का उपयोग करता हूं।
निक कोव

क्यों न यू सिर्फ self.titleLabel का उपयोग करें? आपको अतिरिक्त चीज़ की क्या आवश्यकता है?
ज़ापोरोज़ेन्को ओलेकेंडर

3

Xamarin.iOS समाधान

var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);            
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);

सिस्टम को फिट करने के लिए आकार समायोजित करने से पहले मैंने फ़ॉन्ट को "बड़ा" बनाने के लिए फ़ॉन्ट आकार सेट करना समाप्त कर दिया।


3

निक कोव के जवाब पर आधारित:

import UIKit


    extension UIButton {
        @IBInspectable var adjustFontSizeToWidth: Bool {
            get {
                return titleLabel!.adjustsFontSizeToFitWidth
            }
            set {
                titleLabel!.adjustsFontSizeToFitWidth = newValue
                titleLabel!.lineBreakMode             = .byClipping
            }
        }
    }

यह काम करता है, लेकिन फ़ॉन्ट आकार बहुत कम हो रहा है, जैसे 17 से 12 तक। क्या स्ट्रिंग बड़ा होने पर टाइटललैब की चौड़ाई बढ़ाने का कोई तरीका है?
आर। मोहन

@ आर.मोहन ज़रूर, लेकिन यह सब निश्चित चौड़ाई के बारे में है। बस अड़चन तय नहीं है, और यह बढ़ेगा। दोनों अग्रणी / अनुगमन सेट न करें, या उनमें से एक
Zaporozhchenko Oleksandr

0

नीचे समाधान मेरे लिए काम किया:

button.titleLabel?.adjustsFontForContentSizeCategory = true

डेवलपर दस्तावेज़ इस संपत्ति के बारे में बताते हैं:

एक बूलियन मान दर्शाता है कि क्या डिवाइस की सामग्री आकार श्रेणी में परिवर्तन होने पर ऑब्जेक्ट स्वचालित रूप से अपने फ़ॉन्ट को अपडेट करता है।


0

IOS 13.1 में स्विफ्ट 5 के साथ, मुझे प्रदान करना था contentEdgeInsets पैडिंग को समायोजित भी ।

extension UIButton {
    @IBInspectable var adjustFontSizeToWidth: Bool {
        get {
            return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
        }
        set {
            self.titleLabel?.numberOfLines = 1
            self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
            self.titleLabel?.lineBreakMode = .byClipping;
            self.titleLabel?.baselineAdjustment = .alignCenters
            self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.