উত্তর:
ওভাররাইডিং -textRectForBounds:
কেবল স্থানধারক পাঠ্যের ইনসেট পরিবর্তন করবে। সম্পাদনাযোগ্য পাঠ্যের ইনসেটটি পরিবর্তন করতে, আপনাকে ওভাররাইড করতে হবে-editingRectForBounds:
// placeholder position
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 10, 10);
}
// text position
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 10, 10);
}
UITextField
একটি এর মধ্যে বাস করে তবে স্ক্রোলটি ধীর করে দেবে UIScrollView
।
- (CGRect)clearButtonRectForBounds:(CGRect)bounds { return CGRectMake(x, y, w, h); }
: এখানে পাওয়া stackoverflow.com/questions/5361369/...
আমি এর মাধ্যমে এটি করতে সক্ষম হয়েছি:
myTextField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
অবশ্যই কোয়ার্টজকোর আমদানি করতে এবং আপনার প্রকল্পে ফ্রেমওয়ার্ক যুক্ত করার কথা মনে রাখবেন।
UITextField
এর ডানদিকে সামগ্রীতে ওভারল্যাপ করে।
আপনার যদি কেবল বাম মার্জিনের প্রয়োজন হয় তবে আপনি এটি ব্যবহার করে দেখতে পারেন:
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;
এটা আমার জন্য কাজ করে. আমি আশা করি এটি সাহায্য করতে পারে।
leftView.backgroundColor = textField.backgroundColor;
... সেই দুর্দান্ত সমাধান ব্যতীত ... ধন্যবাদ (:
ইউআইটিেক্সটফিল্ড থেকে প্রাপ্ত ক্লাসে কমপক্ষে এই দুটি পদ্ধতি ওভাররাইড করুন:
- (CGRect)textRectForBounds:(CGRect)bounds;
- (CGRect)editingRectForBounds:(CGRect)bounds;
এটি আপনার মতো অতিরিক্ত সামগ্রী না থাকলে এটি এতটা সহজ হতে পারে:
return CGRectInset(bounds , 10, 10);
ইউআইটিেক্সটফিল্ড একাধিক অবস্থানের পদ্ধতি সরবরাহ করে যা আপনি ওভাররাইড করতে পারেন।
- (CGRect)borderRectForBounds:(CGRect)bounds; - (CGRect)placeholderRectForBounds:(CGRect)bounds; - (CGRect)clearButtonRectForBounds:(CGRect)bounds; - (CGRect)leftViewRectForBounds:(CGRect)bounds; - (CGRect)rightViewRectForBounds:(CGRect)bounds;
কিভাবে একটি @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)
}
}
let rect = CGRect(x: bounds.minX, y: bounds.minY + insetY, width: bounds.width, height: bounds.height) return CGRectInset(rect , insetX , 0)
textRect
/ / editingRect
) স্ক্রোলিং কার্যকারিতাকে প্রভাবিত করে (কমপক্ষে iOS 12 এ), যখন পাঠ্যটি দৃশ্যমান রেক্টটিকে উপচে ফেলে। 15 এর ইনসেট সহ এটি স্ক্রোলিংও বন্ধ করে দেয়।
আপনার যদি একটি পরিষ্কার বোতাম থাকে তবে গৃহীত উত্তরটি আপনার পক্ষে কাজ করবে না। ভবিষ্যতে কল করার মাধ্যমে অ্যাপলকে পরিবর্তন করার বিষয়গুলি থেকেও আমাদের রক্ষা করা উচিত 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 ক্রমে পরামিতি নেয়: উপরে , বাম , নীচে , ডান ।
textRectForBounds:
এবং editingRectForBounds:
পদ্ধতিগুলি আমার জন্য কাজ করেছিল। clearButtonRectForBounds:
clearButtonRectForBounds:
কেবল বামদিকে স্পষ্ট বোতামটি কিছুটা টানতে সহায়তা করে। আপনি এটি ছেড়ে দিতে পছন্দ করতে পারেন। আমার পাঠ্য ক্ষেত্রটি একটি অন্ধকার পটভূমিতে ছিল এবং ডানদিকে সাফ বোতামটির জন্য অতিরিক্ত কিছু প্যাডিং দরকার।
ভেবেছিলাম আমি একটি সুইফট সমাধান সরবরাহ করব 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)
}
}
override func placeholderRectForBounds(bounds: CGRect) -> CGRect { return CGRectInset(bounds, inset, inset) }
textRectForBounds
, স্থানধারকটিও ক্ষতিগ্রস্থ হয় - সুতরাং স্থানধারককে ওভাররাইড যোগ করা প্লেসহোল্ডারকে আরও একটি 10pt আরও ইনসেট করে। আপনি যদি এটি সন্ধান করেন তবে, ও, তবে তা না হলে সচেতন হওয়া ভাল।
ব্যবহার textRectForBounds:
করা সঠিক পন্থা। আমি এটিকে আমার সাবক্লাসে গুটিয়ে রেখেছি যাতে আপনি সহজেই ব্যবহার করতে পারেন textEdgeInsets
। এসএসটিেক্সটফিল্ড দেখুন ।
দ্রুতগতি
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)
}
}
লোকেদের জন্য, যারা আরও সহজ সমাধান অনুসন্ধান করছেন।
যোগ UITextField
ভিতরে UIView
। পাঠ্য ক্ষেত্রের চারপাশে একটি ইনসেট সিমুলেট করার জন্য আমি 10 পিক্স বাম রাখি এবং প্রস্থটি ভিউয়ের চেয়ে 20px কম। পাঠ্যক্ষেত্রের চারদিকে বৃত্তাকার কোণার সীমানার জন্য দর্শন সীমানাটি ব্যবহার করুন
viewBG.layer.cornerRadius = 8.0;
viewBG.layer.borderColor = [UIColor darkGrayColor].CGColor;
viewBG.layer.borderWidth = 1.0;
UITextView
সম্ভবত উল্লেখ করা হয় ?
বাম ভিউ সেট করে আপনি ইউআইটিেক্সটফিল্ডের জন্য পাঠ্য ইনসেট সেট করতে পারেন।
এটার মত:
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;
imageView.contentMode = UIViewContentMode.Center imageView.frame = CGRectMake(0.0, 0.0, imageView.image!.size.width + 16.0, imageView.image!.size.height)
ইউআইটিেক্সটফিল্ডে প্যাডিং যুক্ত করার জন্য একটি ভাল পন্থা হল ইউআইটিেক্সটফিল্ডটি সাবক্লাস করা এবং একটি এজআইসেটস সম্পত্তি যুক্ত করা। তারপরে আপনি প্রান্ত সেট করুন এবং ইউআইটিেক্সটফিল্ড সেই অনুযায়ী আঁকা হবে। এটি একটি কাস্টম বামদর্শন বা ডানদর্শন দৃশ্যের সাথে সঠিকভাবে কাজ করবে।
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
ইন্টারফেস বিল্ডারে সুইফট 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)
}
}
ব্যবহার:
&
কোনও সাবক্লাস না করেই এটি আমি দ্রুততম পথ খুঁজে পেয়েছি:
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
এখানে সুইফ্ট 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)
}
সুইফট ৪.২ সংস্করণ:
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)
}
}
আপনি কোনও পাঠের ক্ষেত্রের মধ্যে পাঠ্যটির অবস্থানটিকে সামঞ্জস্য করতে পারেন পদ্ধতির একটি সাবক্লাস করে UITextField
ও -textRectForBounds:
পদ্ধতিটিকে ওভাররাইড করে ।
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)
}
}
বাম, শীর্ষ, ডান এবং নীচে ইনসেট এবং সাফ বাটন অবস্থানেও সমর্থন করে এটি হ্যান্ডেল করতে আমি ইউআইটিেক্সটফিল্ড সাবক্লেস করেছি।
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
এটি অন্যান্য উদাহরণগুলির মতো সংক্ষিপ্ত নয়, তবে এই সমস্যাটি সমাধান করার জন্য সম্পূর্ণ ভিন্ন পদ্ধতির গ্রহণ করে। দ্রষ্টব্য, ক্যারেটটি এখনও বাম প্রান্তে ফ্লাশ শুরু করবে তবে টাইপ / প্রদর্শিত হলে পাঠ্যটি সঠিকভাবে ইন্ডেন্ট করা হবে। যদি আপনি কেবল বাম মার্জিনের সন্ধান করেন এবং আপনি ইতিমধ্যে ব্যবহার করছেন তবে এটি সাবক্লাসিং ছাড়াই কাজ করে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
তা বেশ বিপদজনক .. আমি পরিবর্তিত কপিটি সবই করতাম।
আমি সাধারণত সাবক্লাসিং এড়ানোর চেষ্টা করি তবে আপনার যদি ইতিমধ্যে থাকে তবে এটি কাজ করে:
// 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)];
}
সাবক্লাসিংয়ের কোনও প্রয়োজন নেই এমন অন্য একটি সমাধান ফেলতে:
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 তবুও অ্যাপল ইউআইটিেক্সটফিল্ডের স্তর স্তরক্রম পরিবর্তন করতে পারে এমন জিনিসগুলি খারাপভাবে আবিষ্কার করতে পারে।
কাস্টমাইজযোগ্য ইনসেটস সহ ইন্টারফেস বিল্ডারে সেট করা একটি বাম ভিউ (কাস্টম আইকন) এবং একটি কাস্টম ক্লিয়ার বোতাম অন্তর্ভুক্ত করার জন্য এখানে একটি বিবিধ সুইফ্ট উত্তর রয়েছে।
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)
}
}
একটি সমাধান যা আসলে কাজ করে এবং সমস্ত ক্ষেত্রে কভার করে:
offsetBy
নয়insetBy
।Rect
।নমুনা:
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)
}
আপনি যদি শীর্ষ এবং বাম ইনডেন্টটি পরিবর্তন করতে চান তবেই
// স্থানধারীর অবস্থান
- (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 );
}
সাবক্লাস ছাড়াই দ্রুত সমাধান এবং তদন্তযোগ্য
extension UITextField {
@IBInspectable var textInsets: CGPoint {
get {
return CGPoint.zero
}
set {
layer.sublayerTransform = CATransform3DMakeTranslation(newValue.x, newValue.y, 0);
}
}
}