IOS एप्लिकेशन के लिए UILabel के लिए शीर्ष-बाएँ संरेखण कैसे सेट करें?


99

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

उदाहरण के लिए:

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

जो अजीब लग रहा है :(

क्या कोई ऐसा तरीका है जहां मैं टॉप-लेफ्ट एलाइनमेंट के लिए लेबल टेक्स्ट सेट कर सकता हूं?


जवाबों:


62

फिर से समझाने के बजाय, मैं इसे व्यापक और उच्च श्रेणी के प्रश्न / उत्तर से जोड़ूंगा:

UILabel के भीतर शीर्ष पर पाठ को मुख्य रूप से संरेखित करें

संक्षिप्त उत्तर नहीं है, Apple ने इसे आसान नहीं बनाया, लेकिन यह फ्रेम आकार को बदलकर संभव है।


65

यह करना काफी आसान है। UILabelएक verticalAlignmentसंपत्ति के साथ एक उपवर्ग बनाएँ और textRectForBounds:limitedToNumberOfLinesएक शीर्ष, मध्य या निचले ऊर्ध्वाधर संरेखण के लिए सही सीमा वापस करने के लिए ओवरराइड करें। यहाँ कोड है:

SOLabel.h

#import <UIKit/UIKit.h>

typedef enum
{
    VerticalAlignmentTop = 0, // default
    VerticalAlignmentMiddle,
    VerticalAlignmentBottom,
} VerticalAlignment;

@interface SOLabel : UILabel

   @property (nonatomic, readwrite) VerticalAlignment verticalAlignment;

@end

SOLabel.m

@implementation SOLabel

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) return nil;

    // set inital value via IVAR so the setter isn't called
    _verticalAlignment = VerticalAlignmentTop;

    return self;
}

-(VerticalAlignment) verticalAlignment
{
    return _verticalAlignment;
}

-(void) setVerticalAlignment:(VerticalAlignment)value
{
    _verticalAlignment = value;
    [self setNeedsDisplay];
}

// align text block according to vertical alignment settings
-(CGRect)textRectForBounds:(CGRect)bounds 
    limitedToNumberOfLines:(NSInteger)numberOfLines
{
   CGRect rect = [super textRectForBounds:bounds 
                   limitedToNumberOfLines:numberOfLines];
    CGRect result;
    switch (_verticalAlignment)
    {
       case VerticalAlignmentTop:
          result = CGRectMake(bounds.origin.x, bounds.origin.y, 
                              rect.size.width, rect.size.height);
           break;

       case VerticalAlignmentMiddle:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y + (bounds.size.height - rect.size.height) / 2,
                    rect.size.width, rect.size.height);
          break;

       case VerticalAlignmentBottom:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y + (bounds.size.height - rect.size.height),
                    rect.size.width, rect.size.height);
          break;

       default:
          result = bounds;
          break;
    }
    return result;
}

-(void)drawTextInRect:(CGRect)rect
{
    CGRect r = [self textRectForBounds:rect 
                limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:r];
}

@end

3
मैं भी इस पर चलने से पहले SO पर यहाँ कई अन्य समाधानों की कोशिश की। यह पूरी तरह से काम किया! ध्यान रखें कि यदि आप StoryBoard में ऐसा कर रहे हैं, तो सुनिश्चित करें कि आपने कस्टमलैस विशेषता को SOLabel (या जो भी आप इसे नाम देने का निर्णय लेते हैं) को UILabel (उपयोगिताएँ निरीक्षक) के बजाय सेट करें।
टीएमसी

यह बहुत मददगार है, धन्यवाद। यह centre- या दाएँ संरेखित पाठ के लिए काम नहीं करता, लेकिन का उपयोग कर bounds.size.widthके बजाय rect.size.widthमें textRectForBounds:limitedToNumberOfLines:है कि ठीक करने के लिए लगता है।
ज्योफ हैकवर्थ

1
यदि आपको iOS 9 Xcode 7 में 'थ्रेड 1: EXC_BAD_ACCESS (कोड 2, पता = 0x ...)' का सामना करना पड़ा, तो बस सेटर और गेट्टर को हटा दें - (वर्टिकल एलाइगमेंट) वर्टिकल एलाइनमेंट; और - (शून्य) setVerticalAlignment: (VerticalAlignment) मान कार्य करता है, क्योंकि चर @property है। यह संश्लेषित है और इसमें एक्सेसर्स शामिल हैं।
felixwcf

मैंने विधि में यहाँ कुछ संशोधन किए हैं: "textRectForBounds" - परिणाम = CGRectMake (rect.origin.x, bounds.origin.y, rect.size.width, rect.size.height); मेरे काम को सही बनाने के लिए।
g212gs

50

मुझे StoryBoard में AutoLayout का उपयोग करके एक समाधान मिला।

1) 0 के लिए लाइनों की संख्या और पाठ संरेखण बाईं ओर सेट करें।

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

2) ऊंचाई की सीमा निर्धारित करें।

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

3) ऊंचाई की सीमा संबंध में होनी चाहिए - कम से कम या बराबर

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

4)

   override func viewWillLayoutSubviews() {
        sampleLabel.sizeToFit()
    }

मुझे परिणाम इस प्रकार मिला:

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


2
एक आकर्षण की तरह काम करता है, यहां तक ​​कि पुन: उपयोग के साथ एक UITableViewCell में।
एलेक्स। हार्बर

क्या आप viewWillLayoutSubviewsकंट्रोलर या सेल फाइल में जगह देते हैं? यदि नियंत्रक, यह सेल से यूआईबेल का उपयोग कैसे करता है?
क्रेग। पीयरस

आपने चरण 4 कहाँ रखा है? एक नए उपयोगकर्ता के रूप में, मैं विशुद्ध रूप से यूआई समाधान के लिए उत्साहित था, फिर वह कोड कहीं से भी बाहर नहीं आया और हमें यह नहीं बताया गया कि इसे कहां रखा जाए
वेल्कून

या तो SampleClass.swift या SampleTableViewCell.swift पर
एजी

इसका समाधान होना चाहिए। पूरी तरह से काम करता है, कोई हैक या उपवर्ग आवश्यक है।

45

सॉलैबेल मेरे लिए काम करता है।

स्विफ्ट 3 और 5:

यह संस्करण RTL भाषाओं के लिए समर्थन की अनुमति देने के लिए मूल से अपडेट किया गया है:

public class VerticalAlignLabel: UILabel {
    enum VerticalAlignment {
        case top
        case middle
        case bottom
    }

    var verticalAlignment : VerticalAlignment = .top {
        didSet {
            setNeedsDisplay()
        }
    }

    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)

        if UIView.userInterfaceLayoutDirection(for: .unspecified) == .rightToLeft {
            switch verticalAlignment {
            case .top:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        } else {
            switch verticalAlignment {
            case .top:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
            case .middle:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
            case .bottom:
                return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
            }
        }
    }

    override public func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}

स्विफ्ट 1:

class UIVerticalAlignLabel: UILabel {

enum VerticalAlignment : Int {
    case VerticalAlignmentTop = 0
    case VerticalAlignmentMiddle = 1
    case VerticalAlignmentBottom = 2
}

var verticalAlignment : VerticalAlignment = .VerticalAlignmentTop {
    didSet {
        setNeedsDisplay()
    }
}

required init(coder aDecoder: NSCoder){
    super.init(coder: aDecoder)
}

override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
    let rect = super.textRectForBounds(bounds, limitedToNumberOfLines: limitedToNumberOfLines)

    switch(verticalAlignment) {
        case .VerticalAlignmentTop:
            return CGRectMake(bounds.origin.x, bounds.origin.y, rect.size.width, rect.size.height)
        case .VerticalAlignmentMiddle:
            return CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height) / 2, rect.size.width, rect.size.height)
        case .VerticalAlignmentBottom:
            return CGRectMake(bounds.origin.x, bounds.origin.y + (bounds.size.height - rect.size.height), rect.size.width, rect.size.height)
        default:
            return bounds
    }
}

override func drawTextInRect(rect: CGRect) {
    let r = self.textRectForBounds(rect, limitedToNumberOfLines: self.numberOfLines)
    super.drawTextInRect(r)
    }
}

अगर मैं इस कोड का उपयोग करके एक लेबल बनाने की कोशिश करता हूं: var myLabel = VerticalAlignLabel () मुझे "कॉल में पैरामीटर 'कोडर' के लिए" लापता तर्क "मिलता है। मैं इस वर्टिकलएलिग्नलैब उपवर्ग का उपयोग करके एक लेबल कैसे बना सकता हूं?
RanLearns

1
स्विफ्ट संस्करण 3 को अभी आज़माएं - मेरे पास एक आवश्यक init था जिसकी आवश्यकता नहीं है।
टोटिजी

14

मेरे मामले में, यह bottom spaceअड़चन का मुद्दा था । मैंने उसे सेट कर दिया था = 16

जब मैंने इसे सेट किया bottom to >= 16, तो यह समस्या हल हो गई।

इसके अलावा, यदि आपके पास लेबल में कोई ऊंचाई की बाधा है, तो आपको इसे हटाने की आवश्यकता है।

यहाँ आकार निरीक्षक में मेरे लेबल की बाधा दृश्य है:

बाधा


लेबल का चयन करते समय मेरे पास कोई बाधा विकल्प नहीं हैं।
वेल्कून

सरलतम निर्धारण - बाधाओं और ऑटो लेआउट का ध्यान रखें। धन्यवाद!
जेसन

13

अपने कोड में

label.text = @"some text";
[label sizeToFit];

खबरदार है कि अगर आप उस तालिका कोशिकाओं या अन्य विचारों का उपयोग करते हैं, जो अलग-अलग डेटा के साथ पुनर्नवीनीकरण हो जाते हैं, तो आपको मूल फ्रेम को कहीं स्टोर करना होगा और sizeToFit को कॉल करने से पहले इसे रीसेट करना होगा।


मैं वास्तव में इस बिंदु पर यह सब Autolayout के लिए छोड़ने की सिफारिश करेंगे। यह अब जरूरत नहीं है।
n13

9

मुझे उसी समस्या का एक और समाधान मिला। मैं के UITextViewबजाय एक का उपयोग किया UILabelऔर स्विच editable()करने के लिए समारोह false


@geekyaleks यह गूंगा हैक क्यों है? एक अच्छा वर्कअराउंड की तरह लगता है, सवाल का सीधा जवाब नहीं होने के अलावा इसके साथ कोई अन्य मुद्दे हैं?
क्रिस्टोफर लार्सन

यह उचित नहीं है, क्योंकि आप नौकरी के लिए उपयुक्त यूआई घटक का उपयोग नहीं कर रहे हैं। यह ऊर्ध्वाधर संरेखण के रूप में सरल रूप में कुछ के लिए एक समझौता नहीं होना चाहिए। नौकरी के लिए सही घटक का उपयोग करने की आवश्यकता है। कुछ भी एक हैक है ...
geekyaleks 19

7

मुझे भी यह समस्या हो रही थी लेकिन मुझे जो मिला वह वह क्रम था जिसमें आपने उइबेल के गुणों और विधियों को निर्धारित किया था!

यदि आप फोन [label sizeToFit]से पहले label.font = [UIFont fontWithName:@"Helvetica" size:14];फिर पाठ शीर्ष करने के लिए एक जैसी नहीं है, लेकिन अगर आप उन्हें चारों ओर स्वैप तो यह करता है!

मैंने यह भी देखा कि पहले टेक्स्ट सेट करने से भी फर्क पड़ता है।

उम्मीद है की यह मदद करेगा।


महान। sizeToFit () को सबसे अंत में बुलाया जाना चाहिए।
MKatleast3

4

जैसा कि आप इंटरफ़ेस बिल्डर का उपयोग कर रहे हैं, अपने लेबल के लिए बाधाओं को सेट करें (साथ ही ऊंचाई और चौड़ाई निर्धारित करना सुनिश्चित करें)। फिर आकार निरीक्षक में, लेबल के लिए ऊंचाई की जांच करें। वहाँ आप इसे = के बजाय = पढ़ना चाहेंगे। फिर उस दृश्य नियंत्रक के लिए कार्यान्वयन में, लाइनों की संख्या 0 (आईबी में भी की जा सकती है) और लेबल [लेबल sizeToFit] सेट करें; और जब आपके पाठ की लंबाई बढ़ जाती है, तो लेबल ऊँचाई में बढ़ेगा और आपके पाठ को ऊपरी बाएँ में रखेगा।


4

यदि आपको जो गैर-संपादन योग्य पाठ चाहिए, वह डिफ़ॉल्ट रूप से ऊपरी बाएँ कोने से शुरू होता है, तो आप किसी लेबल के बजाय केवल टेक्स्ट दृश्य का उपयोग कर सकते हैं और फिर अपना राज्य इस तरह गैर-संपादन योग्य पर सेट कर सकते हैं:

textview.isEditable = false

लेबल के साथ खिलवाड़ करने से आसान तरीका ...

चीयर्स!


3

सोलेबेल कार्यों के साथ समाधान, धन्यवाद।

Bellow I ने मोनोटच संस्करण जोड़ा है:

    public class UICustomLabel : UILabel
{
    private UITextVerticalAlignment _textVerticalAlignment;

    public UICustomLabel()
    {
        TextVerticalAlignment = UITextVerticalAlignment.Top;
    }

    public UITextVerticalAlignment TextVerticalAlignment
    {
        get
        {
            return _textVerticalAlignment;
        }
        set
        {
            _textVerticalAlignment = value;
            SetNeedsDisplay();
        }
    }

    public override void DrawText(RectangleF rect)
    {
        var bound = TextRectForBounds(rect, Lines);
        base.DrawText(bound);
    }

    public override RectangleF TextRectForBounds(RectangleF bounds, int numberOfLines)
    {
        var rect = base.TextRectForBounds(bounds, numberOfLines);
        RectangleF resultRect;
        switch (TextVerticalAlignment)
        {
            case UITextVerticalAlignment.Top:
                resultRect = new RectangleF(bounds.X, bounds.Y, rect.Size.Width, rect.Size.Height);
                break;
            case UITextVerticalAlignment.Middle:
                resultRect = new RectangleF(bounds.X,
                                            bounds.Y + (bounds.Size.Height - rect.Size.Height)/2,
                                            rect.Size.Width, rect.Size.Height);
                break;
            case UITextVerticalAlignment.Bottom:
                resultRect = new RectangleF(bounds.X,
                                            bounds.Y + (bounds.Size.Height - rect.Size.Height),
                                            rect.Size.Width, rect.Size.Height);
                break;

            default:
                resultRect = bounds;
                break;
        }

        return resultRect;
    }
}

public enum UITextVerticalAlignment
{
    Top = 0, // default
    Middle,
    Bottom
}

3

सबसे आसान और आसान तरीका है StackView में लेबल एम्बेड करना और StackView की एक्सिस को हॉरिज़ॉन्टल, एलाइनमेंट टू टॉप इन एट्रीब्यूट इंस्पेक्टर टू स्टोरीबोर्ड से सेट करना जैसे यहां दिखाया गया है


2

टोटिजी के भयानक उत्तर के शीर्ष पर बिल्डिंग, मैंने एक IBDesignable क्लास बनाया है जो स्टोरीबर्ड से उइबेल के वर्टिकल अलाइनमेंट को कस्टमाइज़ करना बेहद आसान बनाता है। बस यह सुनिश्चित करें कि आप स्टोरीबिल बोर्ड के पहचान निरीक्षक से अपना यूआईलेबेल का वर्ग 'वर्टिकल ए लिग्नलबेल' सेट करें। यदि ऊर्ध्वाधर संरेखण प्रभावी नहीं होता है, तो संपादक पर जाएं - सभी दृश्यों को ताज़ा करें जो कि चाल करना चाहिए।

यह कैसे काम करता है: एक बार जब आप अपने यूबिल के वर्ग को सही ढंग से सेट करते हैं, तो स्टोरीबोर्ड आपको एक इनपुट फ़ील्ड दिखाना चाहिए जो पूर्णांक (संरेखण कोड) लेता है।

अद्यतन: मैं केंद्रित लेबल ~ सेव के लिए समर्थन जोड़ा है


शीर्ष संरेखण के लिए 0 दर्ज करें

मध्य संरेखण के लिए 1 दर्ज करें

नीचे संरेखण के लिए 2 दर्ज करें

    @IBDesignable class VerticalAlignLabel: UILabel {
    
    @IBInspectable var alignmentCode: Int = 0 {
        didSet {
            applyAlignmentCode()
        }
    }
    
    func applyAlignmentCode() {
        switch alignmentCode {
        case 0:
            verticalAlignment = .top
        case 1:
            verticalAlignment = .topcenter
        case 2:
            verticalAlignment = .middle
        case 3:
            verticalAlignment = .bottom
        default:
            break
        }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
        self.applyAlignmentCode()
    }
    
    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        
        self.applyAlignmentCode()
    }
    
    enum VerticalAlignment {
        case top
        case topcenter
        case middle
        case bottom
    }
    
    var verticalAlignment : VerticalAlignment = .top {
        didSet {
            setNeedsDisplay()
        }
    }
    
    override public func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)
        
        if #available(iOS 9.0, *) {
            if UIView.userInterfaceLayoutDirection(for: .unspecified) == .rightToLeft {
                switch verticalAlignment {
                case .top:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .topcenter:
                    return CGRect(x: self.bounds.size.width - (rect.size.width / 2), y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .middle:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
                case .bottom:
                    return CGRect(x: self.bounds.size.width - rect.size.width, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
                }
            } else {
                switch verticalAlignment {
                case .top:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .topcenter:
                    return CGRect(x: (self.bounds.size.width / 2 ) - (rect.size.width / 2), y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
                case .middle:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
                case .bottom:
                    return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
                }
            }
        } else {
            // Fallback on earlier versions
            return rect
        }
    }
    
    override public func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}


2

आप अपने यूआईलैब को केवल UITextView में भी बदल सकते हैं, क्योंकि वे मूल रूप से UITextView के लाभ को छोड़कर एक ही काम करते हैं, यह पाठ स्वचालित रूप से शीर्ष बाईं ओर संरेखित होता है


1

मुझे यह समस्या है, लेकिन मेरा लेबल UITableViewCell में था, और निधि में कि समस्या को हल करने का सबसे आसान तरीका एक खाली UIView बनाना था और इसके अंदर लेबल को ऊपर और बाईं ओर केवल श्राप के लिए विवश करना था। लाइनों की संख्या को 0 पर सेट करें


0

IOS 7 के लिए वही है जो मैंने बनाया और मेरे लिए काम किया

@implementation UILabel (VerticalAlign)
- (void)alignTop
{
    CGSize boundingRectSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
    NSDictionary *attributes = @{NSFontAttributeName : self.font};
    CGRect labelSize = [self.text boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                              attributes:attributes
                                                 context:nil];
    int numberOfLines= ceil(labelSize.size.height / self.font.lineHeight);

    CGRect newFrame = self.frame;
    newFrame.size.height = numberOfLines * self.font.lineHeight;
    self.frame = newFrame;
}

- (void)alignBottom
{
    CGSize boundingRectSize = CGSizeMake(self.frame.size.width, CGFLOAT_MAX);
    NSDictionary *attributes = @{NSFontAttributeName : self.font};
    CGRect labelSize = [self.text boundingRectWithSize:boundingRectSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
                                            attributes:attributes
                                               context:nil];
    int numberOfLines= ceil(labelSize.size.height / self.font.lineHeight);

    int numberOfNewLined = (self.frame.size.height/self.font.lineHeight) - numberOfLines;

    NSMutableString *newLines = [NSMutableString string];
    for(int i=0; i< numberOfNewLined; i++){
        [newLines appendString:@"\n"];
    }
    [newLines appendString:self.text];
    self.text = [newLines mutableCopy];
}

0

स्विफ्ट 2.0:: यूआईबेल एक्सटेंशन का उपयोग करना

एक खाली स्विफ्ट फ़ाइल में निरंतर एनम मान बनाएं।

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

 case VERTICAL_ALIGNMENT_TOP = "VerticalAlignmentTop"
 case VERTICAL_ALIGNMENT_MIDDLE = "VerticalAlignmentMiddle"
 case VERTICAL_ALIGNMENT_BOTTOM = "VerticalAlignmentBottom"

}

UILabel एक्सटेंशन का उपयोग करना:

एक खाली स्विफ्ट क्लास बनाएं और उसे नाम दें। निम्नलिखित जोड़ें।

//  AppExtensions.swift

import Foundation
import UIKit

    extension UILabel{ 
     func makeLabelTextPosition (sampleLabel :UILabel?, positionIdentifier : String) -> UILabel
     {
      let rect = sampleLabel!.textRectForBounds(bounds, limitedToNumberOfLines: 0)

      switch positionIdentifier
      {
      case "VerticalAlignmentTop":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5, bounds.origin.y, rect.size.width, rect.size.height)
       break;

      case "VerticalAlignmentMiddle":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5,bounds.origin.y + (bounds.size.height - rect.size.height) / 2,
        rect.size.width, rect.size.height);
       break;

      case "VerticalAlignmentBottom":
       sampleLabel!.frame = CGRectMake(bounds.origin.x+5, bounds.origin.y + (bounds.size.height - rect.size.height),rect.size.width, rect.size.height);
       break;

      default:
       sampleLabel!.frame = bounds;
       break;
      }
      return sampleLabel!

     }
    }

उपयोग:

myMessageLabel.makeLabelTextPosition(messageLabel, positionIdentifier: UILabelTextPositions.VERTICAL_ALIGNMENT_TOP.rawValue)

क्या आप बता सकते हैं कि इसके लिए क्या आवश्यक है sampleLabel: UILabel??
क्रेग। पीयरस

इस फंक मेक लॅबलैट टेक्स्ट प्रपोजल (नमूना लेलबेल: उइलैबेल? पोजिशनडेंटिफायर: स्ट्रिंग) {}, आपको उइबेल ऑब्जेक्ट पास करना होगा।
एजी

0

@ TotiG के उत्तर का 3 संस्करण स्विफ्ट करें

class UIVerticalAlignLabel: UILabel {
    enum VerticalAlignment : Int {
        case VerticalAlignmentTop = 0
        case VerticalAlignmentMiddle = 1
        case VerticalAlignmentBottom = 2
    }

    @IBInspectable var verticalAlignment : VerticalAlignment = .VerticalAlignmentTop {
        didSet {
            setNeedsDisplay()
        }
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines: Int) -> CGRect {
        let rect = super.textRect(forBounds: bounds, limitedToNumberOfLines: limitedToNumberOfLines)

        switch(verticalAlignment) {
        case .VerticalAlignmentTop:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y, width: rect.size.width, height: rect.size.height)
        case .VerticalAlignmentMiddle:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height) / 2, width: rect.size.width, height: rect.size.height)
        case .VerticalAlignmentBottom:
            return CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height - rect.size.height), width: rect.size.width, height: rect.size.height)
        }
    }

    override func drawText(in rect: CGRect) {
        let r = self.textRect(forBounds: rect, limitedToNumberOfLines: self.numberOfLines)
        super.drawText(in: r)
    }
}

0

@ टोटिजी का उत्तर सही है और मेरी समस्या का समाधान किया है। लेकिन मुझे इस पद्धति को लागू करते समय एक समस्या मिली, 5 एस, एसई जैसे छोटे उपकरणों में, यह मेरे लिए काम नहीं करता है। मुझे अंदर सेट करना label.sizeToFit()हैoverride func layoutSubViews()

override func layoutSubViews() {
    super.layoutSubViews()
    // Do other works if needed
    label.sizeToFit()
}

0

स्विफ्ट 5

यह सरल है, गुणों का क्रम सब कुछ है।

titleLabel.frame = CGRect(x: 20, y: 20, width: 374, height: 291.2)
titleLabel.backgroundColor = UIColor.clear //set a light color to see the frame
titleLabel.textAlignment = .left
titleLabel.lineBreakMode = .byTruncatingTail
titleLabel.numberOfLines = 4
titleLabel.font = UIFont(name: "HelveticaNeue-Bold", size: 35)
titleLabel.text = "Example"
titleLabel.sizeToFit()
self.view.addSubview(titleLabel)

-2

IOS एप्लिकेशन के लिए UILabel के लिए शीर्ष-बाएँ संरेखण कैसे सेट करें? मेरे लिए "टॉप लेफ्ट" कार्य के लिए सेट सामग्री मोड लेबल, बहुत बहुत धन्यवाद:
IOS एप्लिकेशन के लिए UILabel के लिए शीर्ष-बाएँ संरेखण कैसे सेट करें?  मेरे लिए "टॉप लेफ्ट" काम करने के लिए लेबल सेट कंटेंट मोड, बहुत बहुत धन्यवाद


1
मेरे लिए बिल्कुल कुछ नहीं करता है। यह सहज रूप से ऐसा लगता है जैसे यह समाधान होना चाहिए, यही कारण है कि जब मैंने काम नहीं किया (तो उस मामले के लिए जैक बिल्कुल लगता है) के लिए मैंने Google की ओर रुख किया।
वेल्कून
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.