बैलेंस मल्टी लाइन यूलाबेल - आईओएस, ऑब्जेक्ट-सी, यूलाबेल, लाइन ब्रेक

जब मैं एक बनाते हैं UILabel साथ में textAlignement करने के लिए सेट NSTextAlignmentCenter, lineBreakMode सेवा मेरे NSLineBreakByWordWrapping और एक लंबा पाठ, यह इस तरह विभाजित है:

+------------------------------------+
| Text that does not fit on a single |
|                line                |
+------------------------------------+

लेकिन मैं वास्तव में क्या चाहता हूं इस तरह कुछ है:

+------------------------------------+
|       Text that does not fit       |
|          on a single line          |
+------------------------------------+

बेशक मैं डॉन "t मैन्युअल रूप से लाइन ब्रेक को संभालना चाहते हैं। मैं चाहता हूं कि लेबल स्वचालित रूप से लाइनों को संतुलित करे ताकि उनकी लंबाई जितनी संभव हो उतनी करीब हो।

उत्तर:

जवाब के लिए 3 № 1

मेरे पास एक ही समस्या थी और इस सवाल से प्रेरित मुझे केवल ओवरराइड करके समाधान मिला - (void)drawTextInRect:(CGRect)rect

आप इसे देख सकते हैं यह गिटहब परियोजना

विधि स्वयं ही अगर आप इसे प्रतिलिपि बनाना / पढ़ना चाहते हैं यहाँ

- (void)drawTextInRect:(CGRect)rect {
if (self.textAlignment == NSTextAlignmentCenter) {
CGRect oneLineRect = [self textRectForBounds:CGRectInfinite limitedToNumberOfLines:1];
NSInteger numberOfLines = ceil(oneLineRect.size.width / self.bounds.size.width);
CGFloat betterWidth = (oneLineRect.size.width / numberOfLines);
if (betterWidth < rect.size.width) {
CGRect check = CGRectZero;
do {
betterWidth *= 1.1;
CGRect b = CGRectMake(0, 0, betterWidth, CGRectInfinite.size.height);
check = [self textRectForBounds:b limitedToNumberOfLines:0];
} while (check.size.height > rect.size.height && betterWidth < rect.size.width);

if (betterWidth < rect.size.width) {
CGFloat difference = rect.size.width - betterWidth;
rect = CGRectMake(rect.origin.x + difference/2.0, rect.origin.y, betterWidth, rect.size.height);
}
}
}
[super drawTextInRect:rect];
}

पीआर, कांटे, टिप्पणियों का स्वागत है!


उत्तर № 2 के लिए 1

मैं स्विफ्ट 3 (आईओएस 10) में काम कर रहा हूं, इसलिए मैंने परिवर्तित किया dev_jacउन लोगों के लिए जवाब जो इसकी आवश्यकता है:

override func drawText(in rect: CGRect) {
var newRect = rect

if (textAlignment == .center) {
let oneLineRect = self.textRect(forBounds: CGRect.infinite, limitedToNumberOfLines: 1)
let numLines = ceil(oneLineRect.size.width / self.bounds.size.width)
var betterWidth : CGFloat = oneLineRect.size.width / numLines
if (betterWidth < rect.size.width) {
var check = CGRect.zero
repeat {
betterWidth *= 1.1
let b = CGRect(x: 0, y: 0, width: betterWidth, height: CGRect.infinite.size.height)
check = self.textRect(forBounds: b, limitedToNumberOfLines: 0)
} while (check.size.height > rect.size.height && betterWidth < rect.size.width)

if betterWidth < rect.size.width {
let difference : CGFloat = rect.size.width - betterWidth
newRect = CGRect(x: rect.origin.x + difference/2, y: rect.origin.y, width: betterWidth, height: rect.size.height)
}
}
}

super.drawText(in: newRect)
}

जवाब के लिए 0 № 3

आपको जिस चीज की आवश्यकता है उसके लिए कोई समर्थन नहीं है। आपको अपनी गणना करने की आवश्यकता होगी NSString boundingRectWithSize:options:attributes:context:। दो भरे लाइनों को पाने के लिए आपको सबसे अच्छी चौड़ाई खोजने के लिए विभिन्न आकारों के माध्यम से लूप करना होगा। फिर आकार के लिए उस चौड़ाई का उपयोग करें UILabel


उत्तर के लिए -1 № 4

यदि आप ऑटो लेआउट का उपयोग कर रहे हैं, UILabel "रों preferredMaxLayoutWidth संपत्ति आपके लिए उपयोग की जा सकती है।


संबंधित सवाल
सबसे लोकप्रिय