iphone - आईओएसएबल के लिए आईआईएलएबल के लिए टॉप-बाएं संरेखण कैसे सेट करें?




ios label (10)

@ 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)
    }
}

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

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

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

क्या कोई तरीका है जहां मैं लेबल-पाठ को शीर्ष-बाएं संरेखण के लिए उचित सेट कर सकता हूं?


SoLabel काम के साथ समाधान, धन्यवाद।

भाई मैंने मोनोचच संस्करण जोड़ा है:

    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
}

आपके कोड में

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

सावधान रहें कि यदि आप तालिका कक्षों या अन्य दृश्यों में इसका उपयोग करते हैं जो विभिन्न डेटा के साथ पुनर्नवीनीकरण करते हैं, तो आपको मूल फ्रेम को कहीं भी स्टोर करना होगा और आकार को कॉल करने से पहले इसे रीसेट करना होगा।


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


फिर से समझाए जाने के बजाय, मैं इस व्यापक और अत्यधिक मूल्यांकन किए गए प्रश्न / उत्तर से लिंक करूंगा:

UILabel के भीतर टेक्स्ट को लंबवत रूप से संरेखित करें

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


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


मुझे स्टोरीबोर्ड में ऑटोलाउट का उपयोग करके एक समाधान मिला।

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

2) ऊंचाई बाधा सेट करें।

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

4)

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

मुझे निम्न परिणाम मिला:


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

textview.isEditable = false

लेबल के साथ गड़बड़ करने से रास्ता आसान है ...

चीयर्स!


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

स्विफ्ट 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)
    }
}

स्विफ्ट 3:

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

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)
    }
}

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

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

//  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)




text-alignment