ios - UILabel টেক্সট মার্জিন




cocoa-touch uikit (20)

আমি একটি UILabel বাম UILabel / মার্জ সেট করতে UILabel এবং তাই করার জন্য একটি পদ্ধতি খুঁজে UILabel না। লেবেল একটি পটভূমি সেট তাই তার মূল পরিবর্তন শুধু কৌতুক করা হবে না। বাম দিকের দিকে 10px বা তাই দ্বারা পাঠ্যটি আনসেট করা আদর্শ।


Multiline টেক্সটের জন্য বাম এবং ডান মার্জিন NSAttributedString ব্যবহার করে সেট করা যেতে পারে।

NSMutableParagraphStyle *style =  [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
style.alignment = NSTextAlignmentJustified;
style.firstLineHeadIndent = 10.0f;
style.headIndent = 10.0f;
style.tailIndent = -10.0f;   

NSAttributedString *attrText = [[NSAttributedString alloc] initWithString:title attributes:@{ NSParagraphStyleAttributeName : style}];  

UILabel * label = [[UILabel alloc] initWithFrame:someFrame];
label.numberOfLines = 0;
label.attributedText = attrText;

Subclassing যেমন একটি সহজ ক্ষেত্রে জন্য একটু কষ্টকর। একটি বিকল্প কেবল একটি UIView পটভূমি সেট সঙ্গে একটি UIView কোন পটভূমি সেট সঙ্গে UILabel যোগ করা হয়। লেবেল এর x থেকে 10 সেট করুন এবং লেবেলটির চেয়ে বাইরের দৃশ্যটির আকার ২0 পিক্সেলের বেশি করুন।


UILabel এর পরিবর্তে সম্ভবত github.com/mattt/TTTAttributedLabel ব্যবহার করুন

BITAttributedLabel *label = [BITAttributedLabel new];
label.font = font;
label.text = @"hello";
label.textInsets = UIEdgeInsetsMake(10, 10, 10, 10);
[label sizeToFit];

Xamarin ব্যবহারকারীদের জন্য (ইউনিফায়েড API ব্যবহার করে):

class UIMarginLabel : UILabel
{
    public UIMarginLabel()
    {
    }

    public UIMarginLabel( RectangleF frame ) : base( frame )
    {
    }

    public UIEdgeInsets Insets { get; set; }

    public override void DrawText( CGRect rect )
    {
        base.DrawText( Insets.InsetRect( rect ) );
    }
}

এবং মূল MonoTouch এপিআই ব্যবহার করে যারা জন্য:

public class UIMarginLabel : UILabel
{
    public UIEdgeInsets Insets { get; set; }

    public UIMarginLabel() : base()
    {
        Insets = new UIEdgeInsets(0, 0, 0, 0);
    }
    public UIMarginLabel(RectangleF frame) : base(frame)
    {
        Insets = new UIEdgeInsets(0, 0, 0, 0);
    }

    public override void DrawText(RectangleF frame)
    {
        base.DrawText(new RectangleF(
            frame.X + Insets.Left,
            frame.Y + Insets.Top,
            frame.Width - Insets.Left - Insets.Right,
            frame.Height - Insets.Top - Insets.Bottom));
    }
}

আপনি iOS 6+ এ অটলআউট ব্যবহার করছেন, তবে আপনি UILabel একটি উপশ্রেণীতে intrinsicContentSize UILabel এটি করতে পারেন।

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.textAlignment = NSTextAlignmentRight;
    }
    return self;
}

- (CGSize)intrinsicContentSize 
{
    CGSize size = [super intrinsicContentSize];
    return CGSizeMake(size.width + 10.0, size.height);
}

আপনি একটি custom ফ্রেম সঙ্গে আপনার UILabel আরম্ভ করে এই সমাধান করতে পারেন।

    CGRect initialFrame = CGRectMake(0, 0, 100, 100);
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 10, 0, 0);
    CGRect paddedFrame = UIEdgeInsetsInsetRect(initialFrame, contentInsets);

    self.label = [[UILabel alloc] initWithFrame:paddedFrame];

CGRect ঠাট ঠেকানো


আমি UILabel subclassing দ্বারা এবং এই UILabel দ্বারা সমাধান drawTextInRect: এই মত:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

সুইফ্ট 3.1 সমতুল্য:

override func drawText(in rect: CGRect) {
    let insets = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
    super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}

আপনি একত্রিত হতে পারে, এটি টিসি এর উত্তর একটি অভিযোজন। এটির উপর দুটি সুবিধা রয়েছে:

  1. একটি sizeToFit বার্তা পাঠানোর মাধ্যমে এটি ট্রিগার করার কোন প্রয়োজন নেই
  2. এটি লেবেল ফ্রেমটিকে একমাত্র ছেড়ে দেয় - যদি আপনার লেবেলটির ব্যাকগ্রাউন্ড থাকে এবং আপনি এটি সঙ্কুচিত করতে না চান তবে সহজ

আমি উপরের উত্তরগুলিতে UIButton ব্যবহার করার UIButton । তাই আমি প্রস্তাব করা হবে।

আমি UIButton ব্যবহার করে আমার পরিস্থিতি সেরা সমাধান ছিল কারণ:

  • আমি একটি সহজ একক লাইন টেক্সট ছিল
  • আমি UILabel জন্য একটি কন্টেইনার হিসাবে UILabel ব্যবহার করতে চাই না (অর্থাত আমি আমার সেলের অটলআউটের জন্য গণিত গণনা সহজ করতে চেয়েছিলেন)
  • আমি NSParagraphStyle ব্যবহার করতে চাই না (কারণ tailIndent সাথে ভুল কাজ করে - UILabel এর প্রস্থ প্রত্যাশিত চেয়ে ছোট)
  • আমি UITextView ব্যবহার করতে UITextView (সম্ভাব্য পার্শ্ব প্রতিক্রিয়াগুলির কারণে)
  • আমি UILabel subclass চেয়েছিলেন না

সুতরাং, contentInsets ব্যবহার করে আমার পরিস্থিতিতে contentInsetsUIButton পাঠ্য মার্জিন যোগ করার সবচেয়ে সহজ উপায় হয়ে ওঠে।

এই কেউ সাহায্য করবে আশা করি।


এক্সকোড 6.1.1 একটি এক্সটেনশন ব্যবহার করে সুইট সমাধান।

ফাইল নামটি "UILabel + AddInsetMargin.swift" এর মতো কিছু হতে পারে:

import UIKit

extension UILabel
{
    public override func drawRect(rect: CGRect)
    {
        self.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)))
    }
}

এখানে একটি দ্রুত সমাধান। আপনার লেবেলটি তৈরি করার সময় কেবল এই ফাইলটির নীচে এই কাস্টম শ্রেণিকে যুক্ত করুন (অথবা এটির জন্য একটি নতুন ফাইল তৈরি করুন) এবং UILabel এর পরিবর্তে MyLabel ব্যবহার করুন।

class MyLabel: UILabel{
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)))
    }
}

এবং একটি @ আইবি ডিজাইনযোগ্য যা এটি ইন্টারফেস বিল্ডারের সাথে কাজ করে

সুইফ্ট 4

//
//  PaddedLabel.swift
//  TrainCentric
//
//  Created by Arsonik
//  https://.com/a/33244365/337934
//

import Foundation

@IBDesignable
class PaddedLabel: UILabel {

    @IBInspectable var inset:CGSize = CGSize(width: 0, height: 0)

    var padding: UIEdgeInsets {
        var hasText:Bool = false
        if let t = self.text?.count, t > 0 {
            hasText = true
        }
        else if let t = attributedText?.length, t > 0 {
            hasText = true
        }

        return hasText ? UIEdgeInsets(top: inset.height, left: inset.width, bottom: inset.height, right: inset.width) : UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: padding))
    }

    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let p = padding
        let width = superContentSize.width + p.left + p.right
        let heigth = superContentSize.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let p = padding
        let width = superSizeThatFits.width + p.left + p.right
        let heigth = superSizeThatFits.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }
}

সুইফ্ট 2

@IBDesignable
class PaddedLabel: UILabel {

    @IBInspectable var inset:CGSize = CGSize(width: 0, height: 0)

    var padding: UIEdgeInsets {
        var hasText:Bool = false
        if let t = text?.length where t > 0 {
            hasText = true
        }
        else if let t = attributedText?.length where t > 0 {
            hasText = true
        }

        return hasText ? UIEdgeInsets(top: inset.height, left: inset.width, bottom: inset.height, right: inset.width) : UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }

    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, padding))
    }

    override func intrinsicContentSize() -> CGSize {
        let superContentSize = super.intrinsicContentSize()
        let p = padding
        let width = superContentSize.width + p.left + p.right
        let heigth = superContentSize.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }

    override func sizeThatFits(size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let p = padding
        let width = superSizeThatFits.width + p.left + p.right
        let heigth = superSizeThatFits.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }
}

পুনর্ব্যবহৃত ইস্পাত এর উত্তর Swift সংস্করণ + intrinsizeContentSize()

এটি ইন্টারফেস বিল্ডারে ইনসেট সেট করার সময় ইনসেটগুলির সাথে অন্য দৃশ্য বস্তুর জন্য অন্তর সেট করার আরও বেশি প্রথাগত শৈলীকে সমর্থন করে, যেমন ইনসেটগুলিকে প্রোগ্রাম্যাটিকভাবে সেট করা হয়:

label.inset = UIEdgeInsetsMake(0, 0, 5, 0)

কোন বাগ আছে যদি আমাকে জানাতে দয়া করে।

সুইফ্ট 3

@IBDesignable class InsetLabel: UILabel {
    @IBInspectable var topInset: CGFloat = 0.0
    @IBInspectable var leftInset: CGFloat = 0.0
    @IBInspectable var bottomInset: CGFloat = 0.0
    @IBInspectable var rightInset: CGFloat = 0.0

    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)
        }
        set {
            topInset = newValue.top
            leftInset = newValue.left
            bottomInset = newValue.bottom
            rightInset = newValue.right
        }
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var adjSize = super.sizeThatFits(size)
        adjSize.width += leftInset + rightInset
        adjSize.height += topInset + bottomInset

        return adjSize
    }

    override var intrinsicContentSize: CGSize {
        var contentSize = super.intrinsicContentSize
        contentSize.width += leftInset + rightInset
        contentSize.height += topInset + bottomInset

        return contentSize
    }
}

সুইফ্ট 2.2

@IBDesignable class InsetLabel: UILabel {
    @IBInspectable var topInset: CGFloat = 0.0
    @IBInspectable var leftInset: CGFloat = 0.0
    @IBInspectable var bottomInset: CGFloat = 0.0
    @IBInspectable var rightInset: CGFloat = 0.0

    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)
        }
        set {
            topInset = newValue.top
            leftInset = newValue.left
            bottomInset = newValue.bottom
            rightInset = newValue.right
        }
    }

    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
    }

    override func sizeThatFits(size: CGSize) -> CGSize {
        var adjSize = super.sizeThatFits(size)
        adjSize.width += leftInset + rightInset
        adjSize.height += topInset + bottomInset

        return adjSize
    }

    override func intrinsicContentSize() -> CGSize {
        var contentSize = super.intrinsicContentSize()
        contentSize.width += leftInset + rightInset
        contentSize.height += topInset + bottomInset

        return contentSize
    }
}

ব্রড রবার্টসনের দ্বারা প্রদত্ত উত্তরটি প্রসারিত করতে আপনি আইবি ডিজাইনযোগ্য বিট যুক্ত করতে পারেন। এই আপনি স্টোরিবোর্ডের মধ্যে থেকে লেবেল সামঞ্জস্য করতে পারেন মানে।

আপনার subclassed UILabel কি করবেন

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface insetLabel : UILabel

@property (nonatomic, assign) IBInspectable CGFloat leftEdge;
@property (nonatomic, assign) IBInspectable CGFloat rightEdge;
@property (nonatomic, assign) IBInspectable CGFloat topEdge;
@property (nonatomic, assign) IBInspectable CGFloat bottomEdge;

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

তারপর করবেন;

#import "insetLabel.h"

@implementation insetLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect
{
    self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);

    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width  += self.edgeInsets.left + self.edgeInsets.right;
    size.height += self.edgeInsets.top + self.edgeInsets.bottom;
    return size;
}

@end

সম্পাদনা

আপনি সম্ভবত এজেন্টসেটের জন্য একটি সেট্টার পদ্ধতি যোগ করা উচিত।


সুইফ্ট 3 দিয়ে, আপনি UILabel একটি উপশ্রেণী তৈরি করে পছন্দসই প্রভাব UILabel । এই উপশ্রেণীতে, আপনাকে প্রয়োজনীয় UIEdgeInsets সাথে একটি UIEdgeInsets সম্পত্তি যুক্ত করতে হবে এবং drawText(in:) পদ্ধতি, intrinsicContentSize drawText(in:) সম্পত্তি (অটো লেআউট কোডের জন্য) এবং / অথবা sizeThatFits(_:) পদ্ধতি (স্প্রিংস এবং sizeThatFits(_:) কোডের জন্য) কে ওভাররাইড করতে হবে।

import UIKit

class PaddingLabel: UILabel {

    let padding: UIEdgeInsets

    // Create a new PaddingLabel instance programamtically with the desired insets
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) {
        self.padding = padding
        super.init(frame: CGRect.zero)
    }

    // Create a new PaddingLabel instance programamtically with default insets
    override init(frame: CGRect) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(frame: frame)
    }

    // Create a new PaddingLabel instance from Storyboard with default insets
    required init?(coder aDecoder: NSCoder) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(coder: aDecoder)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, padding))
    }

    // Override `intrinsicContentSize` property for Auto layout code
    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }

    // Override `sizeThatFits(_:)` method for Springs & Struts code
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let width = superSizeThatFits.width + padding.left + padding.right
        let heigth = superSizeThatFits.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }

}

নিম্নলিখিত উদাহরণটি একটি UIViewControllerPaddingLabel ইনস্ট্যান্সগুলি কীভাবে ব্যবহার করবেন তা দেখায়:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var storyboardAutoLayoutLabel: PaddingLabel!
    let autoLayoutLabel = PaddingLabel(padding: UIEdgeInsets(top: 20, left: 40, bottom: 20, right: 40))
    let springsAndStructsLabel = PaddingLabel(frame: CGRect.zero)
    var textToDisplay = "Lorem ipsum dolor sit er elit lamet."

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set autoLayoutLabel
        autoLayoutLabel.text = textToDisplay
        autoLayoutLabel.backgroundColor = .red
        autoLayoutLabel.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(autoLayoutLabel)
        autoLayoutLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30).isActive = true
        autoLayoutLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        // Set springsAndStructsLabel
        springsAndStructsLabel.text = textToDisplay
        springsAndStructsLabel.backgroundColor = .green
        view.addSubview(springsAndStructsLabel)
        springsAndStructsLabel.frame.origin = CGPoint(x: 30, y: 90)
        springsAndStructsLabel.sizeToFit()

        // Set storyboardAutoLayoutLabel
        storyboardAutoLayoutLabel.text = textToDisplay
        storyboardAutoLayoutLabel.backgroundColor = .blue
    }

    // Link this IBAction to a UIButton or a UIBarButtonItem in Storyboard
    @IBAction func updateLabelText(_ sender: Any) {
        textToDisplay = textToDisplay == "Lorem ipsum dolor sit er elit lamet." ? "Lorem ipsum." : "Lorem ipsum dolor sit er elit lamet."

        // autoLayoutLabel
        autoLayoutLabel.text = textToDisplay

        // springsAndStructsLabel
        springsAndStructsLabel.text = textToDisplay
        springsAndStructsLabel.sizeToFit()

        // storyboardAutoLayoutLabel
        storyboardAutoLayoutLabel.text = textToDisplay
    }

}

সুইফ্টে রূপান্তরিত ব্লেবট্রোয়ের আসনার (কোন সাবস্ক্যাসিং প্রয়োজন নেই)

let style: NSMutableParagraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
style.alignment = .Justified
style.firstLineHeadIndent = 10.0
style.headIndent = 10.0
style.tailIndent = -10.0
let attrText: NSAttributedString = NSAttributedString(string: title, attributes: [NSParagraphStyleAttributeName:style])
let label: UILabel = UILabel(frame: someFrame)
label.numberOfLines = 0
label.attributedText = attrText

হয়তো পার্টি জন্য পরে, কিন্তু নিম্নলিখিত কাজ করে। শুধু Uilabel subclass।

#import "UITagLabel.h"

#define padding UIEdgeInsetsMake(5, 10, 5, 10)

@implementation UITagLabel

- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding)];
}

- (CGSize) intrinsicContentSize {
    CGSize superContentSize = [super intrinsicContentSize];
    CGFloat width = superContentSize.width + padding.left + padding.right;
    CGFloat height = superContentSize.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

- (CGSize) sizeThatFits:(CGSize)size {
    CGSize superSizeThatFits = [super sizeThatFits:size];
    CGFloat width = superSizeThatFits.width + padding.left + padding.right;
    CGFloat height = superSizeThatFits.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

@end

আমি একটি লাইন লেবেল জন্য উল্লম্ব প্যাডিং পরিত্রাণ পেতে:

// I have a category method setFrameHeight; you'll likely need to modify the frame.
[label setFrameHeight:font.pointSize];

অথবা, বিভাগ ছাড়া, ব্যবহার করুন:

CGRect frame = label.frame;
frame.size.height = font.pointSize;
label.frame = frame;

হয়তো আপনি এই কোড চেষ্টা করতে পারে

CGRect frame = btn.titleLabel.frame;
int indent = 20;
int inset = 20;
[btn.titleLabel setFrame:CGRectMake(frame.origin.x+inset,frame.origin.y,frame.size.width+indent,frame.size.height)];

আমি UILabelমার্জিন সেটিং করার জন্য কোন পদ্ধতি আছে মনে । কেন আপনি প্রয়োজন জায়গায় লেবেল অবস্থান সেট না?

নীচের কোডটি দেখুন:

UILabel *label = [[UILabel alloc] init];
label.text = @"This is label";
label.frame = CGRectMake(0,0,100,100);

যদি ইন্টারফেস নির্মাতা থেকে তারপর শুধুমাত্র অবস্থানের দ্বারা লেবেল করুন:

yourLabel.frame = CGRectMake(0,0,100,100);

যদি লেবেল প্রোগ্রাম্যাটিকভাবে তৈরি করা হয়, প্যাডিং সাইজট্যাটফিট পদ্ধতি ব্যবহার করে গণনা করা যেতে পারে। একাধিক লাইন ব্যবহার করলে, পাঠ্যটি সর্বোচ্চ প্রস্থ মানতে লাইনযুক্ত হবে।

let text = UILabel()
let padding = 10
text.layer.cornerRadius = 5
text.layer.masksToBounds = true
text.text = "Hello"
text.font = UIFont(name: text.font.fontName, size: 18)
text.textAlignment = NSTextAlignment.center
text.numberOfLines = 1

let maxSize = CGSize(width: 100, height: 100)
var size = text.sizeThatFits(maxSize)
size.width = size.width + padding * 2
size.height = size.height + padding * 2
text.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: size)






uilabel