আইওএস অ্যাপ্লিকেশনের জন্য ইউআইএলবেলের শীর্ষ বাম প্রান্তিককরণ কীভাবে সেট করবেন?


99

আমি আমার নিব ফাইলটিতে একটি লেবেল যুক্ত করেছি, তারপরে সেই লেবেলের জন্য শীর্ষ-বাম প্রান্তিককরণ থাকা দরকার। যেহেতু আমি রানটাইমে পাঠ্য সরবরাহ করছি তাই এটি নিশ্চিত নয় যে সেখানে কতগুলি লাইন রয়েছে। সুতরাং যদি পাঠ্যটিতে কেবল একটি একক লাইন থাকে তবে এটি উল্লম্ব-কেন্দ্ররেখায় প্রদর্শিত হবে। এই প্রান্তরেখার সামনে আমার সংশ্লিষ্ট লেবেলের সাথে মেলে না।

উদাহরণ স্বরূপ:

এখানে চিত্র বর্ণনা লিখুন

যা দেখতে অদ্ভুত দেখাচ্ছে :(

এমন কোনও উপায় আছে যেখানে আমি লেবেল পাঠ্যটিকে শীর্ষ-বাম প্রান্তিককরণের সাথে সঠিকভাবে সেট করতে পারি?



এই ক্ষেত্রে, অটো লেআউট, উচ্চতা এবং নীচের অ্যাঙ্করগুলিতে সীমাবদ্ধতার বৈশিষ্ট্যগুলি ব্যবহার করুন।
KoreanXcodeWorker

উত্তর:


61

পুনরায় ব্যাখ্যা করার পরিবর্তে, আমি বরং এটির বিস্তৃত এবং উচ্চ রেটযুক্ত প্রশ্ন / উত্তরটির সাথে লিঙ্ক করব:

উল্লম্বভাবে একটি UILabel এর মধ্যে শীর্ষে পাঠ্য প্রান্তিককরণ করুন

সংক্ষিপ্ত উত্তরটি হ'ল না, অ্যাপল এটিকে সহজ করেনি, তবে ফ্রেমের আকার পরিবর্তন করে এটি সম্ভব।


65

এটি করা মোটামুটি সহজ। শীর্ষ, মধ্যম বা নীচে উল্লম্ব সারিবদ্ধকরণের জন্য সঠিক UILabelগণ্ডি ফিরে পাওয়ার জন্য একটি verticalAlignmentসম্পত্তি সহ একটি sublcass তৈরি করুন 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

4
আমি এটির ওপরে চালানোর আগে আরও অনেকগুলি সমাধান এখানে চেষ্টা করেছিলাম। এটা পুরোপুরি কাজ! মনে রাখবেন আপনি স্টোরিবোর্ডে যদি এটি করছেন তবে নিশ্চিত হয়ে নিন যে আপনি ইউআইএলবেলের পরিবর্তে (ইউটিলিটি ইন্সপেক্টরটিতে) সোলাবেলের (বা আপনি এটির নাম নির্ধারণ করার সিদ্ধান্ত নেওয়ার জন্য) কাস্টমক্লাস অ্যাট্রিবিউট সেট করেছেন make
টিএমসি

এটি খুব সহায়ক, আপনাকে ধন্যবাদ। এটা তোলে centre- বা ডান-প্রান্তিক পাঠ্যের জন্য কাজ না করে, কিন্তু ব্যবহার bounds.size.widthপরিবর্তে rect.size.widthমধ্যে textRectForBounds:limitedToNumberOfLines:এটি ঠিক বলে মনে হয়।
জিফ হ্যাকওয়ার্থ

4
আপনি যদি আইওএস 9 এক্সকোড 7-তে 'থ্রেড 1: EXC_BAD_ACCESS (কোড 2, ঠিকানা = 0x ...)' এর মুখোমুখি হয়ে থাকেন তবে কেবল সেটর এবং গিটারটি সরান - (উল্লম্ব অ্যালাইনমেন্ট) উল্লম্বলাইনমেন্ট; এবং - (অকার্যকর) সেট ভার্টিক্যাল অ্যালাইনমেন্ট: (ভার্টিকাল অ্যালাইনমেন্ট) মান ফাংশন, যেহেতু ভেরিয়েবলটি @ প্রোপার্টি হয়। এটি সংশ্লেষিত এবং এতে অ্যাকসেসর রয়েছে।
felixwcf

পদ্ধতিতে এখানে আমার কিছু সংশোধনী রয়েছে: "টেক্সটআরেক্টফোর্ডবাউন্ডস" - ফলাফল = সিজিআরেক্টমেক (rect.origin.x, বাউন্ডস.রিগিন.ইই, রেকট.সাইজ.উইথথ, রেক্টট.সাইজ.হাইট); ডানএলাইনমেন্ট ইউইলযোগ্য জন্য আমার কাজ করতে।
g212gs

50

স্টোরিবোর্ডে অটোলআউট ব্যবহার করে আমি একটি সমাধান পেয়েছি।

1) 0 তে কোনও লাইন এবং বামে পাঠ্য প্রান্তিককরণ সেট করুন।

এখানে চিত্র বর্ণনা লিখুন

2) উচ্চতা সীমাবদ্ধতা সেট করুন।

এখানে চিত্র বর্ণনা লিখুন

3) উচ্চতার সীমাবদ্ধতা সম্পর্কিত হতে হবে - কম বা সমান

এখানে চিত্র বর্ণনা লিখুন

4)

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

আমি ফলাফলটি এইভাবে পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন


4
এমনকি পুনরায় ব্যবহারের সাথে কোনও ইউআইটিএবলভিউসকলে একটি কবজির মতো কাজ করে।
alex.bour

আপনি কি viewWillLayoutSubviewsনিয়ামক বা সেল ফাইলটিতে রাখেন? যদি নিয়ামক হয় তবে এটি সেল থেকে ইউআইএলবেলকে কীভাবে অ্যাক্সেস করবে?
ক্রেগ.পর্স

কোথায় আপনি 4 পদক্ষেপ রাখেন? একটি নতুন ব্যবহারকারী হিসাবে, আমি একটি সম্পূর্ণরূপে ইউআই সমাধান পেয়ে উত্তেজিত ছিলাম, তখন সেই কোডটি কোথাও থেকে প্রকাশিত হবে এবং এটি কোথায় রাখা হবে তা আমাদের জানানো হয়নি
ভেলকুন

হয় স্যাম্পলক্লাস.সুইফ্ট বা স্যাম্পেল টেবিলভিউ সেল.সুইফ্ট
এজি

এটি সমাধান হওয়া উচিত। পুরোপুরি কাজ করে, কোনও হ্যাক বা সাবক্লাসিংয়ের প্রয়োজন নেই।
কৌতূহলী 101

46

সোলাবেল আমার পক্ষে কাজ করে।

সুইফট 3 এবং 5:

আরটিএল ভাষাগুলি সমর্থন করার জন্য এই সংস্করণটি মূল থেকে আপডেট করা হয়েছে:

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 = VericalAlignLabel () আমি "কলটিতে প্যারামিটার 'কোডার' এর জন্য অনুপস্থিত আর্গুমেন্ট পেয়েছি। আমি এই ভার্টিকালআলাইনলিবেল সাবক্লাসটি ব্যবহার করে কীভাবে একটি লেবেল তৈরি করতে পারি?
রানলর্নস

4
এখনই সুইফ্ট সংস্করণ 3 ব্যবহার করে দেখুন - আমার একটি প্রয়োজনীয় থিম ছিল যা প্রয়োজন হয় না।
টটিজি

15

আমার ক্ষেত্রে এটি ছিল bottom spaceবাধা বিষয়। আমি সেট করে দিয়েছি = 16

আমি যখন এটি সেট করি তখন bottom to >= 16এই সমস্যাটি সমাধান হয়ে যায়।

এছাড়াও, যদি লেবেলে আপনার কোনও উচ্চতার সীমাবদ্ধতা থাকে তবে আপনার এটি সরিয়ে ফেলতে হবে।

আকার পরিদর্শকটিতে এখানে আমার লেবেলের সীমাবদ্ধতা দেখুন:

বাধা


যখন আমি কোনও লেবেল নির্বাচন করি তখন আমার কাছে কোনও বাধা বিকল্প নেই।
ভেলকুন

সহজতম সমাধান - সীমাবদ্ধতা এবং অটো লেআউটটি এটির যত্ন নিতে দিন। ধন্যবাদ!
জেসন

13

আপনার কোডে

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

সাবধানতা অবলম্বন করুন যে আপনি যদি টেবিল কোষে বা অন্য দর্শনে যা বিভিন্ন ডেটা দিয়ে পুনর্ব্যবহারযোগ্য হয় তা ব্যবহার করেন, আপনাকে মূল ফ্রেমটি কোথাও সংরক্ষণ করতে হবে এবং সাইজটোফিট কল করার আগে এটি পুনরায় সেট করতে হবে।


আমি এই মুহূর্তে অটোলেআউট এ সব ছেড়ে দেওয়ার প্রস্তাব দিই। এটি আর প্রয়োজন হয় না।
n13

9

আমি একই সমস্যার জন্য আরও একটি সমাধান খুঁজে পেয়েছি। আমি এর UITextViewপরিবর্তে ব্যবহার করেছি UILabelএবং এতে editable()ফাংশনটি স্যুইচ করেছি false


@ geekyaleks কেন এটি বোবা হ্যাক? শালীন কাজের মতো মনে হচ্ছে, প্রশ্নের প্রত্যুত্তর না হওয়ার পাশাপাশি এর সাথে আর কোনও সমস্যা আছে কি?
ক্রিস্টোফার লারসেন

এটি উপযুক্ত নয়, কারণ আপনি কাজের জন্য উপযুক্ত ইউআই উপাদান ব্যবহার করছেন না। এটি উল্লম্ব সারিবদ্ধ হিসাবে সহজ কিছু জন্য আপস করা উচিত নয়। কাজের জন্য সঠিক উপাদানটি ব্যবহার করা দরকার। অন্য যে কোনও কিছু হ্যাক ...
গিকিয়ালিক্স

7

আমারও এই সমস্যা ছিল তবে আমি যা পেয়েছি তা হ'ল আপনি ইউআইএলবেলের সম্পত্তি এবং পদ্ধতিগুলির বিষয়ে যে আদেশটি স্থাপন করেছেন!

আপনি যদি [label sizeToFit]আগে কল করেন label.font = [UIFont fontWithName:@"Helvetica" size:14];তবে পাঠ্যটি শীর্ষে প্রান্তিক না হয় তবে আপনি যদি এগুলি চারপাশে স্যুপ করে থাকেন তবে তা হয়!

আমি আরও লক্ষ্য করেছি যে পাঠ্যটি প্রথমে সেট করা একটি পার্থক্য করে।

আশাকরি এটা সাহায্য করবে.


দুর্দান্ত সাইজটোফিট () একেবারে শেষ দিকে কল করা উচিত।
এম কে্যাটলিস্ট

4

আপনি যখন ইন্টারফেস বিল্ডার ব্যবহার করছেন, আপনার লেবেলের সীমাবদ্ধতাগুলি সেট করুন (পাশাপাশি উচ্চতা এবং প্রস্থও নির্ধারণ করতে ভুলবেন না)। তারপরে আকার পরিদর্শকের মধ্যে লেবেলের উচ্চতা পরীক্ষা করুন। সেখানে আপনি এটি = এর পরিবর্তে> = পড়তে চাইবেন। তারপরে এই ভিউ কন্ট্রোলারের জন্য বাস্তবায়নে, লাইনের সংখ্যা 0 তে সেট করুন (আইবিতেও করা যেতে পারে) এবং [লেবেল আকার টোফিট] লেবেলটি সেট করুন; এবং আপনার পাঠ্যটির দৈর্ঘ্য বাড়ার সাথে সাথে লেবেলটি উচ্চতায় বৃদ্ধি পাবে এবং আপনার পাঠ্যটি উপরের বামদিকে রাখবে।


4

আপনার যা প্রয়োজন তা যদি সম্পাদনযোগ্য নয় এমন পাঠ্য যা ডিফল্টরূপে উপরের বাম কোণায় শুরু হয় আপনি কেবলমাত্র একটি লেবেলের পরিবর্তে একটি পাঠ্য ভিউ ব্যবহার করতে পারেন এবং তারপরে তার স্থিতিটি অ-সম্পাদনযোগ্যতে সেট করতে পারেন:

textview.isEditable = false

লেবেলগুলির সাথে গোলযোগের চেয়ে সহজ উপায় ...

চিয়ার্স!


3

সোলেবেলের সাথে সমাধান কাজ করে, ধন্যবাদ।

বেলো আমি মনোোটুচ সংস্করণ যুক্ত করেছি:

    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

সবচেয়ে সহজ এবং সহজ উপায় হ'ল স্ট্যাকভিউতে লেবেল এম্বেড করা এবং স্ট্যাকভিউয়ের অক্ষটি দিগন্তে সেট করা, স্টোরিবোর্ড থেকে অ্যাট্রিবিউট ইন্সপেক্টর এ সারিবদ্ধকরণ শীর্ষস্থান এখানে দেখানো হয়েছে


2

টোটিজির দুর্দান্ত উত্তরটির শীর্ষে বিল্ডিং করে, আমি একটি আইবি ডিজাইনেবল ক্লাস তৈরি করেছি যা স্টোরি বোর্ড থেকে সরাসরি ইউআইএলবেলের উল্লম্ব প্রান্তিককরণটি কাস্টমাইজ করা অত্যন্ত সহজ করে তোলে। কেবল নিশ্চিত হয়ে নিন যে আপনি স্টিলবোর্ড পরিচয় পরিদর্শকের কাছ থেকে আপনার ইউআইএলবেলের ক্লাসটি 'ভার্টিকালআলাইনল্যাবেল'-এ সেট করেছেন। যদি উল্লম্ব সারিবদ্ধতা কার্যকর না হয় তবে সম্পাদক-> সমস্ত দর্শন রিফ্রেশ করুন যা কৌশলটি করা উচিত।

এটি কীভাবে কাজ করে: আপনি একবার আপনার ইউআইএবেলের ক্লাসটি সঠিকভাবে সেট করে নিলে স্টোরিবোর্ডে আপনাকে এমন একটি ইনপুট ক্ষেত্র দেখাতে হবে যা পূর্ণসংখ্যার (প্রান্তিককরণ কোড) নেয়।

আপডেট: আমি কেন্দ্রিক লেবেলগুলির জন্য সমর্থন যোগ করেছি v সেভ


শীর্ষ সারিবদ্ধকরণের জন্য 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

আপনি কেবলমাত্র আপনার ইউআইএলবেলকে ইউআইটিেক্সটভিউতে পরিবর্তন করতে পারেন, কারণ তারা মূলত ইউআইটিেক্সটভিউয়ের সুবিধা ব্যতীত একই জিনিসটি করেন যে পাঠ্যটি স্বয়ংক্রিয়ভাবে উপরের বামে সরে যায়


1

আমার এই সমস্যাটি রয়েছে তবে আমার লেবেলটি ইউআইটিএবলভিউসেল ছিল এবং তহবিলের মধ্যে এই সমস্যাটি সমাধানের সহজতম উপায়টি ছিল খালি ইউআইভিউ তৈরি করা এবং তার অভ্যন্তরে লেবেলটি কেবল উপরে এবং বাম দিকে সীমাবদ্ধ রেখে সেট করা set লাইনের সংখ্যা 0 তে সেট করুন


0

আইওএস 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

সুইফট ২.০: ইউিলাবেল এক্সটেনশন ব্যবহার করে

একটি খালি সুইফ্ট ফাইলটিতে ধ্রুবক এনাম মান করুন।

//  AppRef.swift

import UIKit
import Foundation

enum UILabelTextPositions : String {

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

}

ইউআইলাবেল এক্সটেনশন ব্যবহার:

একটি খালি সুইফ্ট ক্লাস তৈরি করুন এবং নাম দিন। নিম্নলিখিত যোগ করুন।

//  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??
ক্রেগ.প্রিয়স

এই চমকপ্রদ MakeLabelTextPosition (নমুনা লেবেল: UILabel ?, অবস্থানIdentifier: স্ট্রিং) এবং you}, আপনাকে UILabel অবজেক্টটি পাস করতে হবে।
এজি

0

@ টটিজি এর উত্তরের 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

@ টোটিজির উত্তরটি সঠিক এবং আমার সমস্যার সমাধান করেছে। তবে এই পদ্ধতিটি প্রয়োগ করার সময় আমি একটি সমস্যা পেয়েছি, 5s, SE এর মতো ছোট ডিভাইসে এটি আমার পক্ষে কার্যকর হয় না। আমি সেট 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

আইওএস অ্যাপ্লিকেশনের জন্য ইউআইএলবেলের শীর্ষ বাম প্রান্তিককরণ কীভাবে সেট করবেন? লেবেল কনটেন্ট মোডটি "শীর্ষে বাম" আমার জন্য কাজ করে, আপনাকে অনেক ধন্যবাদ:
আইওএস অ্যাপ্লিকেশনের জন্য ইউআইএলবেলের শীর্ষ বাম প্রান্তিককরণ কীভাবে সেট করবেন?  লেবেল কনটেন্ট মোডটি "শীর্ষে বাম" আমার জন্য কাজ করে, আপনাকে অনেক ধন্যবাদ


4
আমার পক্ষে একেবারে কিছুই করে না এটি স্বজ্ঞাতভাবে মনে হয় এটির সমাধান হওয়া উচিত, এ কারণেই যখন আমি কাজ করি না তখন আমি গুগলের দিকে ফিরে যাই (বা আপাতদৃষ্টিতে জ্যাকটি সমস্ত কিছু করে না)।
ভেলকুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.