ইউআইটিেক্সটফিল্ডের জন্য পাঠ্য ইনসেট?


উত্তর:


628

ওভাররাইডিং -textRectForBounds:কেবল স্থানধারক পাঠ্যের ইনসেট পরিবর্তন করবে। সম্পাদনাযোগ্য পাঠ্যের ইনসেটটি পরিবর্তন করতে, আপনাকে ওভাররাইড করতে হবে-editingRectForBounds:

// placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 10, 10);
}

// text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
     return CGRectInset(bounds, 10, 10);
}

10
এই সমাধানটি আমার পক্ষে কাজ করেছে, যদিও আমি সিজিআরেক্টইনেসেটের (রিমান্ড, 9, 0) একটি রিটার্ন মান ব্যবহার করেছি; পাঠ্য রেক্টফোর্ডবাউন্ডস, সম্পাদনারেক্টফোর্ডবাউন্ডস এবং প্লেসোল্ডারআরেক্টফোর্ডবাউন্ডসের জন্যও আমার এই মানটি সেট করতে হবে।
RyJ

2
এই সমাধানটি ক্লিয়ারবটনের সাথে ভাল খেলছে না। টেক্সটফিল্ড ওভারলে বোতামের ভিতরে পাঠ্য।
পাইওটার

আমি মনে করি, উপরের পদ্ধতিগুলিকে ওভাররাইড করা যদি UITextFieldএকটি এর মধ্যে বাস করে তবে স্ক্রোলটি ধীর করে দেবে UIScrollView
ভারত দোদেজা

2
ClearButton স্থাপন জন্য: - (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); } : এখানে পাওয়া stackoverflow.com/questions/5361369/...
Miros

22
আমি সিজিআরেক্টইনসেট (সীমানা, 10, 10) কল করার আগে [সুপার টেক্সটরেটফাউন্ডস বাউন্ডস] এবং [সুপার এডিটিংআরেক্টফোর্ডবাউন্ডস: সীমা] কল করার পরামর্শ দিই। এটি পরিষ্কার বোতাম ওভারলে ইস্যুটি ঠিক করবে।
mrvincenzo

294

আমি এর মাধ্যমে এটি করতে সক্ষম হয়েছি:

myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);

অবশ্যই কোয়ার্টজকোর আমদানি করতে এবং আপনার প্রকল্পে ফ্রেমওয়ার্ক যুক্ত করার কথা মনে রাখবেন।


38
সৃজনশীলতার জন্য +1, তবে এটি কিছুটা সমস্যাযুক্ত, এটি টেক্সটফিল্ডের ভিতরে ডিলিট বোতামটিও সরিয়ে দেয়
নিকিতা

2
আপনি myTextField.layer.sublayers করতে পারেন যা সমস্ত সাবলেয়ারগুলির একটি অ্যারে ... এবং যদি এর ইউআইআইমেজভিউ <- আমি ধরে নিচ্ছি এক্সটি একটি চিত্র .. বা সম্ভবত UIButton ... বা আপনি প্রতিটি একেবারে লুপ করে দেখতে পারেন কোনটি কোন সাবউভিউয়ের সাথে সম্পর্কিত ... তবে myfield.layer.sublayer সমস্ত সাবলেয়ার ট্রান্সফর্ম করুন এবং এভাবে এক্স বোতামটিও সরানো থাকবে ..
chuthan20

এই সমাধানটি আমার পক্ষে কাজ করছে না। আমি কেবল বাম এবং শীর্ষ মার্জিন সেট করতে পারি তবে ডান এবং নীচে নয়। UITextFieldএর ডানদিকে সামগ্রীতে ওভারল্যাপ করে।
ভারত দোদেজা

2
এটি সাবক্লাসিং ছাড়াই সেরা সমাধান এবং পর্দায় অতিরিক্ত, অপ্রয়োজনীয় ভিউগুলি লাগানোর প্রয়োজন নেই! +1 টি!
রামবাতিনো

1
@ জীট.চঞ্চাওয়াত এই ছবিতে ডান পাশের এক্স বোতামটি .. বিকাশকারী.অ্যাপল.
com

169

আপনার যদি কেবল বাম মার্জিনের প্রয়োজন হয় তবে আপনি এটি ব্যবহার করে দেখতে পারেন:

UItextField *textField = [[UITextField alloc] initWithFrame:...];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, textField.frame.size.height)];
leftView.backgroundColor = textField.backgroundColor;
textField.leftView = leftView;
textField.leftViewMode = UITextFieldViewModeAlways;

এটা আমার জন্য কাজ করে. আমি আশা করি এটি সাহায্য করতে পারে।


17
এটি কেবলমাত্র একটি ইনসেট পেতে সাবক্লাসিংয়ের চেয়ে অনেক সহজ এবং আপনাকে বামদিকে যেকোন স্বেচ্ছাসেবক ভিউ যোগ করতে দেয় (আপনি ডানদিকে কিছু রাখতে ডানদর্শনটিও ব্যবহার করতে পারেন)। স্বীকৃত উত্তর আইএমএইচওর চেয়ে ভাল।
কেনি গ্রান্ট

4
+1 সহজ, নো-সাবক্লাসিং, এবং পাঠ্যক্ষেত্রের বৈশিষ্ট্যগুলির সাথে কাজ করার জন্য ডিজাইন করা হয়েছে ('হ্যাকিংয়ের পরিবর্তে')।
সুতরাং ওভার এটি

তৃতীয় লাইনটি হওয়া উচিত leftView.backgroundColor = textField.backgroundColor;... সেই দুর্দান্ত সমাধান ব্যতীত ... ধন্যবাদ (:
অ্যাভিয়েল গ্রস

আজদেবের উত্তরের মতো পুরোপুরি মার্জিত / পুঙ্খানুপুঙ্খ নয়, তবে একটি সাধারণ এবং সাধারণ মামলার দুর্দান্ত সমাধান!
র‌্যামব্র্যান্ড কুইন আইনস্টাইন

1
সাবক্লাসিং আপনার উত্তরের জন্য একটি টন সময় সাশ্রয় করবে, যদি না আপনার কাছে একটি একক পাঠ্য বাক্স থাকে যা আপনার প্রয়োজন হয়।
গুরগুরি

168

ইউআইটিেক্সটফিল্ড থেকে প্রাপ্ত ক্লাসে কমপক্ষে এই দুটি পদ্ধতি ওভাররাইড করুন:

- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;

এটি আপনার মতো অতিরিক্ত সামগ্রী না থাকলে এটি এতটা সহজ হতে পারে:

return CGRectInset(bounds , 10, 10);

ইউআইটিেক্সটফিল্ড একাধিক অবস্থানের পদ্ধতি সরবরাহ করে যা আপনি ওভাররাইড করতে পারেন।


2
হ্যাঁ, আপনি যদি সম্পাদনাটিকে ওভাররাইড না করেন তবে রেক্সটফাউন্ডগুলি পাঠ্যক্ষেত্রের উপরের বাম দিকে সম্পাদনা করার সময় আপনি পাঠ্যটি পান। - (সিজিআরেক্ট) সম্পাদনাআরেক্টফোর্ডবাউন্ডস: (সিজিআরেক্ট) সীমা; রিটার্ন সিজিআরেক্টইনসেট (সীমানা, 10, 10); }
মার্ক ডব্লিউ

1
শুধু মধ্যে editingRectForBounds পদ্ধতি সংহত করতে উত্তর সম্পাদিত
ıɾuǝʞ

5
এটি আমার কাছে এক ভয়ঙ্কর হ্যাক বলে মনে হচ্ছে- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
আপনারও

97

কিভাবে একটি @IBInspectable, @IBDesignableদ্রুত শ্রেণি সম্পর্কে ।

@IBDesignable
class TextField: UITextField {
    @IBInspectable var insetX: CGFloat = 6 {
       didSet {
         layoutIfNeeded()
       }
    }
    @IBInspectable var insetY: CGFloat = 6 {
       didSet {
         layoutIfNeeded()
       }
    }

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , insetX , insetY)
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , insetX , insetY)
    }
}

আপনি এটি আপনার স্টোরিবোর্ডে দেখতে পাবেন।

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

আপডেট - সুইফট 3

@IBDesignable
class TextField: UITextField {
    @IBInspectable var insetX: CGFloat = 0
    @IBInspectable var insetY: CGFloat = 0

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: insetX, dy: insetY)
    }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: insetX, dy: insetY)
    }
}

1
আমি ওয়াইয়ের উপর প্রভাব খুঁজে পেয়েছি আমি প্রয়োগগুলি সামঞ্জস্য করেছিlet rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
ক্রিস ওয়াগনার

1
এবং এটিকেও যুক্ত করুন যদি আপনি প্লেসোল্ডার `ওভাররাইড ফানক প্লেসহোল্ডাররেক্টফোর্ডবাউন্ডস (সীমানা: সিজিআরেক্ট) -> সিজিআরেক্ট C রিটার্ন সিজিআরেক্টইনসেট (সীমানা, ইনসেটএক্স, ইনসেটওয়াই)}`
রমেশভেল

আশ্চর্যের সাথে এটি (ইনসেটগুলি সেট করা textRect/ / editingRect) স্ক্রোলিং কার্যকারিতাকে প্রভাবিত করে (কমপক্ষে iOS 12 এ), যখন পাঠ্যটি দৃশ্যমান রেক্টটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আইএক্সএক্স

29

আপনার যদি একটি পরিষ্কার বোতাম থাকে তবে গৃহীত উত্তরটি আপনার পক্ষে কাজ করবে না। ভবিষ্যতে কল করার মাধ্যমে অ্যাপলকে পরিবর্তন করার বিষয়গুলি থেকেও আমাদের রক্ষা করা উচিত super

সুতরাং, পাঠ্যটি পরিষ্কার বোতামটি ওভারল্যাপ না করে তা নিশ্চিত করার জন্য superপ্রথমে 'ডিফল্ট' মানটি পাওয়া যাক , তারপরে প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন।

এই কোডটি পাঠ্যের ক্ষেত্রের শীর্ষ, বাম এবং নীচে একটি 10px ইনসেট যুক্ত করবে:

@interface InsetTextField : UITextField

@end


@implementation InsetTextField

// Placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect rect = [super textRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGRect rect = [super editingRectForBounds:bounds];
    UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 10, 0);

    return UIEdgeInsetsInsetRect(rect, insets);
}

// Clear button position
- (CGRect)clearButtonRectForBounds:(CGRect)bounds {
    CGRect rect = [super clearButtonRectForBounds:bounds];

    return CGRectOffset(rect, -5, 0);
}

@end

দ্রষ্টব্য: UIEdgeInsetsMake ক্রমে পরামিতি নেয়: উপরে , বাম , নীচে , ডান


আইওএস 7+ ছাড়াই ব্যবহার textRectForBounds:এবং editingRectForBounds:পদ্ধতিগুলি আমার জন্য কাজ করেছিল। clearButtonRectForBounds:
স্টানার

clearButtonRectForBounds:কেবল বামদিকে স্পষ্ট বোতামটি কিছুটা টানতে সহায়তা করে। আপনি এটি ছেড়ে দিতে পছন্দ করতে পারেন। আমার পাঠ্য ক্ষেত্রটি একটি অন্ধকার পটভূমিতে ছিল এবং ডানদিকে সাফ বোতামটির জন্য অতিরিক্ত কিছু প্যাডিং দরকার।
ক্রিস নোলেট

অদ্ভুতভাবে এটি স্ক্রোলিং কার্যকারিতা (আইওএস 12 এ অন্তত 12 এ) প্রভাবিত করে, যখন পাঠ্যটি দৃশ্যমান রেকটটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আইএক্সএক্স

22

ভেবেছিলাম আমি একটি সুইফট সমাধান সরবরাহ করব supply

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds , inset , inset)
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        return CGRectInset(bounds, inset, inset) 
    }
}

সুইফট 3+

import UIKit

class TextField: UITextField {
    let inset: CGFloat = 10

    // placeholder position
    override func textRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    // text position
    override func editingRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset , dy: self.inset)
    }

    override func placeholderRect(forBounds: CGRect) -> CGRect {
        return forBounds.insetBy(dx: self.inset, dy: self.inset)
    }
}

2
ভুলে যাবেন না override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
ইউজিন ব্রাজিনিটস

সুইফ্ট 3 এ আপনাকে অবশ্যই 'সিজিআরেক্ট.ইন.সেটটি বাই ()' পদ্ধতিটি ব্যবহার করতে হবে
ডেন

1
আইওএস ১১-এ অন্ততপক্ষে, আপনি ওভাররাইড করলে textRectForBounds, স্থানধারকটিও ক্ষতিগ্রস্থ হয় - সুতরাং স্থানধারককে ওভাররাইড যোগ করা প্লেসহোল্ডারকে আরও একটি 10pt আরও ইনসেট করে। আপনি যদি এটি সন্ধান করেন তবে, ও, তবে তা না হলে সচেতন হওয়া ভাল।
নিযুক্ত

অদ্ভুতভাবে এটি স্ক্রোলিং কার্যকারিতা (আইওএস 12 এ অন্তত 12 এ) প্রভাবিত করে, যখন পাঠ্যটি দৃশ্যমান রেকটটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আইএক্সএক্স

14

ব্যবহার textRectForBounds:করা সঠিক পন্থা। আমি এটিকে আমার সাবক্লাসে গুটিয়ে রেখেছি যাতে আপনি সহজেই ব্যবহার করতে পারেন textEdgeInsetsএসএসটিেক্সটফিল্ড দেখুন ।


এসএসটিউলকিট পোড আমদানি করার জন্য কোকোপড ব্যবহার করার সাথে সাথে এই পদ্ধতিটি দুর্দান্ত কাজ করে - আমার মনে হয় এটি যাওয়ার সবচেয়ে নিকটতম উপায়।
ক্রিস

ধন্যবাদ ক্রিস! আপনি এটি দরকারী বলে খুশি।
স্যাম সোফেস

14

দ্রুতগতি

 class TextField: UITextField {

    let inset: CGFloat = 8

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: inset, dy: inset)
    }
}

অদ্ভুতভাবে এটি স্ক্রোলিং কার্যকারিতা (আইওএস 12 এ অন্তত 12 এ) প্রভাবিত করে, যখন পাঠ্যটি দৃশ্যমান রেকটটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আইএক্সএক্স

12

লোকেদের জন্য, যারা আরও সহজ সমাধান অনুসন্ধান করছেন।

যোগ UITextFieldভিতরে UIView। পাঠ্য ক্ষেত্রের চারপাশে একটি ইনসেট সিমুলেট করার জন্য আমি 10 পিক্স বাম রাখি এবং প্রস্থটি ভিউয়ের চেয়ে 20px কম। পাঠ্যক্ষেত্রের চারদিকে বৃত্তাকার কোণার সীমানার জন্য দর্শন সীমানাটি ব্যবহার করুন

viewBG.layer.cornerRadius = 8.0;
viewBG.layer.borderColor = [UIColor darkGrayColor].CGColor;
viewBG.layer.borderWidth = 1.0;

2
সত্যিই কেবল ইউআইটিভিউফিল্ডের পিছনে একটি ইউআইভিউ লাগানোই সেরা এবং সহজ সমাধান। ইউআইটিেক্সটফিল্ডটিকে স্বচ্ছ এবং সম্পন্ন করুন। আমি এটি একটি ইউআইটিেক্সটভিউয়ের সাথে সারিবদ্ধ করেছি - প্রায় 6 পিক্সেল ইনসেট হিসাবে দেখা যাচ্ছে। একটি সাবক্লাস তৈরি করার চেয়ে অনেক সহজ এবং আরও নমনীয় ...
n13

এই পদ্ধতির সাথে সমস্যা হ'ল স্ক্রোল বারটি কোথায় উপস্থিত হবে তার অবস্থান।
ডগ আমোস

@ ডগআমোস কী স্ক্রোলবার? আপনি UITextViewসম্ভবত উল্লেখ করা হয় ?
অর্থ-বিষয়গুলি

12

বাম ভিউ সেট করে আপনি ইউআইটিেক্সটফিল্ডের জন্য পাঠ্য ইনসেট সেট করতে পারেন।

এটার মত:

UITextField *yourTextField = [[UITextField alloc] init];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
leftView.backgroundColor = [UIColor clearColor];
yourTextField.leftViewMode = UITextFieldViewModeAlways;
yourTextField.leftView = leftView;

1
যখন আপনার একটি আইকনটির জন্য বাম দৃশ্যটিও ব্যবহার করতে হবে, এই ক্যান্টটি কাজ করবে
রিপার করুন

@ এই পদ্ধতিটি পড়ুন কোনও চিত্রের জন্যও কাজ করবে। আপনি ইমেজভিউ ফ্রেমের প্রস্থে যে পরিমাণ প্যাডিং চান তা যুক্ত করুন এবং কন্টেন্টমোডকে কেন্দ্রে সেট করুন। imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
অ্যান্ডি

এই উপায় খুব হ্যাকি। ইনসেটটি সেট করার জন্য ইতিমধ্যে একটি টেক্সটরেটফোর্ডস পদ্ধতি রয়েছে
জেরাল্ড

12

দ্রুতগতি

    // adjust place holder text
    let paddingView = UIView(frame: CGRectMake(0, 0, 10, usernameOrEmailField.frame.height))
    usernameOrEmailField.leftView = paddingView
    usernameOrEmailField.leftViewMode = UITextFieldViewMode.Always

1
এটি সত্যিই সস্তা এবং সহজ কাজ। ধন্যবাদ!
shnaz

11

ইউআইটিেক্সটফিল্ডে প্যাডিং যুক্ত করার জন্য একটি ভাল পন্থা হল ইউআইটিেক্সটফিল্ডটি সাবক্লাস করা এবং একটি এজআইসেটস সম্পত্তি যুক্ত করা। তারপরে আপনি প্রান্ত সেট করুন এবং ইউআইটিেক্সটফিল্ড সেই অনুযায়ী আঁকা হবে। এটি একটি কাস্টম বামদর্শন বা ডানদর্শন দৃশ্যের সাথে সঠিকভাবে কাজ করবে।

OSTextField.h

#import <UIKit/UIKit.h>

@interface OSTextField : UITextField

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end

OSTextField.m

#import "OSTextField.h"

@implementation OSTextField

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

-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

@end

ভাল উত্তর. নিখোঁজ সম্পত্তি সরবরাহ করে :-)
ফটম্যান

6

ইন্টারফেস বিল্ডারে সুইফট 3 / ডিজাইনেবল / অনুভূমিক এবং উল্লম্ব পোকামাকড় পৃথক করুন / বাক্সের বাইরে ব্যবহারযোগ্য

@IBDesignable
class TextFieldWithPadding: UITextField {

@IBInspectable var horizontalInset: CGFloat = 0
@IBInspectable var verticalInset: CGFloat = 0

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: horizontalInset, dy: verticalInset)
}

override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: horizontalInset , dy: verticalInset)
}

override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: horizontalInset, dy: verticalInset)
}
}

ব্যবহার:

ব্যবহার

&

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


5

আমি আইবিতে এটি করেছি যেখানে আমি টেক্সটভিউয়ের পিছনে একটি ইউআইভিউ তৈরি করেছি যা কিছুটা দীর্ঘ ছিল। পাঠ্যফিল্ডের ব্যাকগ্রাউন্ডের রঙটি সাফ করার জন্য সেট করে। এখানে চিত্র বর্ণনা লিখুন


5

কোনও সাবক্লাস না করেই এটি আমি দ্রুততম পথ খুঁজে পেয়েছি:

UIView *spacerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10., 10.)];
[textField setLeftViewMode:UITextFieldViewModeAlways];
[textField setLeftView:spacerView];

সুইফটে:

let spacerView = UIView(frame:CGRect(x:0, y:0, width:10, height:10))
textField.leftViewMode = UITextFieldViewMode.Always
textField.leftView = spacerView

4

এখানে সুইফ্ট 3 তে একই উপক্লাসযুক্ত ইউআইটিেক্সটফিল্ডটি লেখা আছে এটি সুইফটের পূর্ববর্তী সংস্করণগুলির থেকে একেবারেই আলাদা, আপনি দেখতে পাবেন:

import UIKit

class MyTextField: UITextField
    {
    let inset: CGFloat = 10

    // placeholder position
    override func textRect(forBounds bounds: CGRect) -> CGRect
        {
        return bounds.insetBy(dx: inset, dy: inset)
        }

    // text position
    override func editingRect(forBounds bounds: CGRect) -> CGRect
        {
        return bounds.insetBy(dx: inset, dy: inset)
        }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect
        {
        return bounds.insetBy(dx: inset, dy: inset)
        }
    }

ঘটনাক্রমে, আপনি নীচের মতো কিছু করতেও পারেন, যদি আপনি কেবল একটি পক্ষের ইনসেটটি নিয়ন্ত্রণ করতে চান। কেবলমাত্র বাম ইনসেটটি সামঞ্জস্য করার এই বিশেষ উদাহরণটি যদি আপনি ইউআইটিেক্সটফিল্ডের শীর্ষে কোনও চিত্র রাখেন তবে আপনি এটি ব্যবহারকারীর কাছে টেক্সট ক্ষেত্রের মধ্যে উপস্থিত হতে চান:

    override func editingRect(forBounds bounds: CGRect) -> CGRect
        {
        return CGRect.init(x: bounds.origin.x + inset, y: bounds.origin.y, width: bounds.width - inset, height: bounds.height)
        }

4

সুইফট ৪.২ সংস্করণ:

import UIKit

class InsetTextField: UITextField {

  let inset: CGFloat = 10

  override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }


  override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }

  override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: inset, dy: inset)
  }

}

অদ্ভুতভাবে এটি স্ক্রোলিং কার্যকারিতা (আইওএস 12 এ অন্তত 12 এ) প্রভাবিত করে, যখন পাঠ্যটি দৃশ্যমান রেকটটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আইএক্সএক্স

3

আপনি কোনও পাঠের ক্ষেত্রের মধ্যে পাঠ্যটির অবস্থানটিকে সামঞ্জস্য করতে পারেন পদ্ধতির একটি সাবক্লাস করে UITextField-textRectForBounds:পদ্ধতিটিকে ওভাররাইড করে ।


3

UITextField@ অ্যাডাম ওয়েট উল্লেখ করেছেন যেহেতু ইতিমধ্যে পদ্ধতিগুলি প্রয়োগ করে এটি আপনাকে সাবক্লাসে আবশ্যক । এখানে একটি সুইফট এক্সটেনশন যা একটি কারখানার পদ্ধতি উন্মোচিত করে, যা আমাদের বিভাগগুলির রেপোতেও উপলভ্য :

private class InsetTextField: UITextField {
    var insets: UIEdgeInsets

    init(insets: UIEdgeInsets) {
        self.insets = insets
        super.init(frame: CGRectZero)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("not intended for use from a NIB")
    }

    // placeholder position
    override func textRectForBounds(bounds: CGRect) -> CGRect {
        return super.textRectForBounds(UIEdgeInsetsInsetRect(bounds, insets))
    }

    // text position
    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        return super.editingRectForBounds(UIEdgeInsetsInsetRect(bounds, insets))
    }
}

extension UITextField {

    class func textFieldWithInsets(insets: UIEdgeInsets) -> UITextField {
        return InsetTextField(insets: insets)
    }

}

আপনার উত্তরের লিঙ্কটি মারা গেছে, আপনি কি এটি আপডেট করতে পারবেন?
WendiKidd

ইউআরএল ঠিক করেছেন @ ওয়েন্ডিকিড
ক্রিস্টোফার পিক্সলে

2

বাম, শীর্ষ, ডান এবং নীচে ইনসেট এবং সাফ বাটন অবস্থানেও সমর্থন করে এটি হ্যান্ডেল করতে আমি ইউআইটিেক্সটফিল্ড সাবক্লেস করেছি।

MRDInsetTextField.h

#import <UIKit/UIKit.h>

@interface MRDInsetTextField : UITextField

@property (nonatomic, assign) CGRect inset;

@end

MRDInsetTextField.m

#import "MRDInsetTextField.h"

@implementation MRDInsetTextField

- (id)init
{
    self = [super init];
    if (self) {
        _inset = CGRectZero;
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        _inset = CGRectZero;
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _inset = CGRectZero;
    }
    return self;
}

- (void)setInset:(CGRect)inset {
    _inset = inset;

    [self setNeedsLayout];
}

- (CGRect)getRectForBounds:(CGRect)bounds withInset:(CGRect)inset {

    CGRect newRect = CGRectMake(
                         bounds.origin.x + inset.origin.x,
                         bounds.origin.y + inset.origin.y,
                         bounds.origin.x + bounds.size.width - inset.origin.x - inset.size.width,
                         bounds.origin.y + bounds.size.height - inset.origin.y - inset.size.height
                         );

    return newRect;
}

- (CGRect)textRectForBounds:(CGRect)bounds {
    return [self getRectForBounds:[super textRectForBounds:bounds] withInset:_inset];
}

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
    return [self getRectForBounds:bounds withInset:_inset];
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    return [self getRectForBounds:[super editingRectForBounds:bounds] withInset:_inset];
}

- (CGRect)clearButtonRectForBounds:(CGRect)bounds {
    return CGRectOffset([super clearButtonRectForBounds:bounds], -_inset.size.width, _inset.origin.y/2 - _inset.size.height/2);
}

@end

ব্যবহারের উদাহরণ যেখানে * _সোমেটেক্সটফিল্ড * এমআইবিডিএনসেটসেক্সটফিল্ড কাস্টম ক্লাসের সাথে নিব / স্টোরিবোর্ড ভিউ থেকে আসে

[(MRDInsetTextField*)_someTextField setInset:CGRectMake(5, 0, 5, 0)]; // left, top, right, bottom inset

ধন্যবাদ. যদিও আপনার কোডের জন্য একটি পরামর্শ - আপনি কেন ইনসেটের জন্য সিজিআরেক্ট ব্যবহার করেছেন এবং ইউআইএডজিনসেটস না?

2

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

প্রথমে UITextFieldক্লাসে একটি বিভাগ তৈরি করুন ।

//  UITextField+TextAttributes.h

#import <UIKit/UIKit.h>

@interface UITextField (TextAttributes)

- (void)setIndent:(CGFloat)indent;

@end


//  UITextField+TextAttributes.m
#import "UITextField+TextAttributes.h"

@implementation UITextField (TextAttributes)

- (void)setTextAttributes:(NSDictionary*)textAttributes indent:(CGFloat)indent
{
    if (!textAttributes) return;

    NSMutableParagraphStyle *paragraphStyle = [textAttributes objectForKey:NSParagraphStyleAttributeName];
    paragraphStyle.firstLineHeadIndent = indent;
    paragraphStyle.headIndent = indent;
}

- (void)setIndent:(CGFloat)indent
{
   [self setTextAttributes:self.defaultTextAttributes indent:indent];
   [self setTextAttributes:self.typingAttributes indent:indent];
}

@end

তারপরে, আপনি যদি স্থির ধারকরা ব্যবহার করছেন তবে নিশ্চিত করুন যে কোনও নির্দিষ্ট স্থানধারক একই ইনডেন্টটি সেট করছেন। যথাযথ বৈশিষ্ট্যযুক্ত একটি ডিফল্ট বৈশিষ্ট্যযুক্ত অভিধান তৈরি করুন, এরকম কিছু:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.firstLineHeadIndent = 7;
paragraphStyle.headIndent = 7;
NSDictionary *placeholderAttributes = [NSDictionary dictionaryWithObjectsAndKeys: paragraphStyle, NSParagraphStyleAttributeName, nil];

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

UITextField *textField = [[UITextField alloc] init];
textField.indent = 7;
textField.delegate = self;
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"Placeholder Text" attributes:placeholderAttributes];

শেষ অবধি, প্রতিনিধিতে, textFieldDidBeginEditingপদ্ধতিটি বাস্তবায়ন করুন , এরকম কিছু:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.indent = 7;
}

যে ধারণাটি defaultTextAttributesধারণ করে NSMutableParagraphStyleতা বেশ বিপদজনক .. আমি পরিবর্তিত কপিটি সবই করতাম।
বেন সিনক্লেয়ার

1

আমি সাধারণত সাবক্লাসিং এড়ানোর চেষ্টা করি তবে আপনার যদি ইতিমধ্যে থাকে তবে এটি কাজ করে:

// add a property 
@property (nonatomic) UIEdgeInsets edgeInsets;

// and override:

- (CGRect)textRectForBounds:(CGRect)bounds
{
    return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

- (CGRect)editingRectForBounds:(CGRect)bounds
{
    return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets)];
}

আপনি সাবক্লাসিং এড়ানোর কোনও কারণ? এটা তোলে হয় একটি বৈধ নকশা দৃষ্টান্ত।
স্টানার

1

সাবক্লাসিংয়ের কোনও প্রয়োজন নেই এমন অন্য একটি সমাধান ফেলতে:

UITextField *txtField = [UITextField new];
txtField.borderStyle = UITextBorderStyleRoundedRect;

// grab BG layer
CALayer *bgLayer = txtField.layer.sublayers.lastObject;
bgLayer.opacity = 0.f;

// add new bg view
UIView *bgView = [UIView new];
bgView.backgroundColor = [UIColor whiteColor];
bgView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
bgView.userInteractionEnabled = NO;

[txtField addSubview: bgView];
[txtField sendSubviewToBack: bgView];

আসল ইউআইটিেক্সটফিল্ড স্থির ইউআইটিেক্সটফিল্ড

আইওএস 7 এবং আইওএস 8 দিয়ে পরীক্ষিত Both তবুও অ্যাপল ইউআইটিেক্সটফিল্ডের স্তর স্তরক্রম পরিবর্তন করতে পারে এমন জিনিসগুলি খারাপভাবে আবিষ্কার করতে পারে।


1

কাস্টমাইজযোগ্য ইনসেটস সহ ইন্টারফেস বিল্ডারে সেট করা একটি বাম ভিউ (কাস্টম আইকন) এবং একটি কাস্টম ক্লিয়ার বোতাম অন্তর্ভুক্ত করার জন্য এখানে একটি বিবিধ সুইফ্ট উত্তর রয়েছে।

import UIKit

@IBDesignable
class InsetTextField: UITextField {
@IBInspectable var leftInset:CGFloat = 0
@IBInspectable var rightInset:CGFloat = 0
@IBInspectable var icon:UIImage? { didSet {
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 16, height: 16))
    imageView.image = icon
    self.leftView = imageView
    self.leftViewMode = .Always
} }

@IBInspectable var clearButton:UIImage? { didSet {
    let button = UIButton(type: .Custom)
    button.setImage(clearButton, forState: .Normal)
    button.addTarget(self, action: "clear", forControlEvents: UIControlEvents.TouchUpInside)
    button.frame = CGRect(x: 0, y: 0, width: 18, height: 18)
    self.rightView = button
    self.rightViewMode = .WhileEditing
} }

func clear() {
    self.text = ""
}

override func leftViewRectForBounds(bounds: CGRect) -> CGRect {
    var height:CGFloat = 0
    var width:CGFloat = 0
    if let leftView = self.leftView {
        height = leftView.bounds.height
        width = leftView.bounds.width
    }

    return CGRect(x: leftInset, y: bounds.height/2 - height/2, width: width, height: height)
}

override func rightViewRectForBounds(bounds: CGRect) -> CGRect {
    var height:CGFloat = 0
    var width:CGFloat = 0
    if let rightView = self.rightView {
        height = rightView.bounds.height
        width = rightView.bounds.width
    }

    return CGRect(x: bounds.width - width - rightInset, y: bounds.height/2 - height/2, width: width, height: height)
}

}

1

একটি সমাধান যা আসলে কাজ করে এবং সমস্ত ক্ষেত্রে কভার করে:

  • ব্যবহার করা উচিত offsetByনয়insetBy
  • আসলটি পেতে সুপার ফাংশনটিতেও কল করা উচিত Rect
  • গণ্ডি ত্রুটিযুক্ত। আপনাকে মূল এক্সটি অফসেট করতে হবে, ওয়াই সীমাগুলিতে শূন্য হিসাবে এক্স, ওয়াই রয়েছে।
  • ইউআইটিেক্সটফিল্ডের বাম ভিউ সেট করার সময় অরিজিনাল x, y অ-শূন্য হতে পারে।

নমুনা:

override func textRect(forBounds bounds: CGRect) -> CGRect {
    return super.textRect(forBounds: bounds).offsetBy(dx: 0.0, dy: 4)
}


override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return super.editingRect(forBounds: bounds).offsetBy(dx: 0.0, dy: 4)
}

0

আপনি যদি শীর্ষ এবং বাম ইনডেন্টটি পরিবর্তন করতে চান তবেই

// স্থানধারীর অবস্থান

- (CGRect)textRectForBounds:(CGRect)bounds {

CGRect frame = bounds;
frame.origin.y = 3;
 frame.origin.x = 5;
bounds = frame;
return CGRectInset( bounds , 0 , 0 );
}

// পাঠ্য অবস্থান

- (CGRect)editingRectForBounds:(CGRect)bounds {

CGRect frame = bounds;
frame.origin.y = 3;
 frame.origin.x = 5;
bounds = frame;
return CGRectInset( bounds , 0 , 0 );
}

-1

সাবক্লাস ছাড়াই দ্রুত সমাধান এবং তদন্তযোগ্য

extension UITextField {
    @IBInspectable var textInsets: CGPoint {
            get {
                return CGPoint.zero
            }
            set {
                layer.sublayerTransform = CATransform3DMakeTranslation(newValue.x, newValue.y, 0);
            }
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.