ইউআইটিেক্সটভিউতে কীভাবে মার্জিন / প্যাডিং হারাবেন?


486

আমি একটি আছে UITextViewআমার আইওএস অ্যাপ্লিকেশন, যে পাঠ্য একটি বৃহৎ পরিমাণ প্রদর্শন করা হয় না।

আমি তখন এর অফসেট মার্জিন প্যারামিটার ব্যবহার করে এই পাঠ্যটি পেজিং করছি UITextView

আমার সমস্যাটি হ'ল এর প্যাডিং UITextViewআমার গণনাগুলিকে বিভ্রান্ত করছে কারণ আমি যে ফন্টের আকার এবং টাইপফেসটি ব্যবহার করি তার উপর নির্ভর করে এটি ভিন্ন বলে মনে হয়।

অতএব, আমি প্রশ্ন উত্থাপন করছি: সামগ্রীর সামগ্রীর চারপাশের প্যাডিংগুলি সরিয়ে ফেলা সম্ভব UITextView?

আপনার প্রতিক্রিয়া শোনার জন্য অপেক্ষা করুন!


9
উল্লেখ্য, এই কিউএ প্রায় দশ বছর বয়সী! 100,000+ দর্শন সহ, যেহেতু এটি আইওএসের বোকামি সমস্যাগুলির মধ্যে একটি । জাস্ট এফটিআর আমি বর্তমান, 2017 এ রেখেছি, উত্তর হিসাবে যুক্তিসঙ্গত সহজ / সাধারণ / স্বীকৃত সমাধান নীচে।
ফ্যাটি

1
আমি এখনও আপডেট পেয়েছি, ২০০৯ সালে আইওএস ৩.০ প্রকাশের সময় একটি হার্ডকোডযুক্ত কাজ লিখেছিলাম। আমি কেবল উত্তরটি সম্পাদনা করে পরিষ্কারভাবে জানাতে পেরেছিলাম যে এটি বহু বছরের পুরনো accepted
মাইকেল

উত্তর:


383

2019 এর জন্য আপ টু ডেট

এটি আইওএসের অন্যতম গুরুতর বাগ gs

এখানে দেওয়া ক্লাসটি UITextViewFixedসাধারণত সামগ্রিকভাবে সবচেয়ে যুক্তিসঙ্গত সমাধান।

এখানে ক্লাস:

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
    }
}

পরিদর্শকটিতে সক্রিয় স্ক্রোলটি বন্ধ করতে ভুলবেন না!

  1. সমাধান স্টোরিবোর্ডে সঠিকভাবে কাজ করে

  2. সমাধান রানটাইমে সঠিকভাবে কাজ করে

এটাই, তুমি হয়ে গেছ।

সাধারণভাবে, বেশিরভাগ ক্ষেত্রে আপনার যা প্রয়োজন তা হ'ল

এমনকি যদি আপনি টেক্সট ভিউ উচ্চতা পরিবর্তন করা হয় মাছি উপর , UITextViewFixedসাধারণত আপনার প্রয়োজন নেই।

(উড়ে যাওয়ার উচ্চতা পরিবর্তন করার একটি সাধারণ উদাহরণ, এটি ব্যবহারকারীর ধরণ হিসাবে পরিবর্তন করা))

এখানে অ্যাপল থেকে ভাঙা ইউআইটিেক্সটভিউ ...

ইউআইটিেক্সটভিউয়ের সাথে আইবির স্ক্রিনশট

এখানে UITextViewFixed:

ইউআইটিেক্সটভিউ ফিক্সড সহ আইবির স্ক্রিনশট

অবশ্যই অবশ্যই আপনার অবশ্যই তা নোট করুন

পরিদর্শকটিতে সক্রিয় স্ক্রোলটি বন্ধ করুন!

স্ক্রোলটি বন্ধ করতে ভুলবেন নাএইনবলড! :)


আরও কিছু বিষয়

(1) কিছু অস্বাভাবিক ক্ষেত্রে - উদাহরণস্বরূপ, কিছু নমনীয়, গতিময়ভাবে সেল উচ্চতা পরিবর্তনের সাথে সারণীর কিছু ক্ষেত্রে - অ্যাপল একটি উদ্ভট কাজ করে: তারা নীচে অতিরিক্ত স্থান যুক্ত করে । সত্যিই না! এটি আইওএস-এর সবচেয়ে বিপর্যয়কর জিনিস হতে হবে।

উপরেরটি জুড়তে এখানে একটি "দ্রুত সমাধান" রয়েছে যা সাধারণত সেই উন্মাদনার সাথে সহায়তা করে।

...
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0

        // this is not ideal, but you can sometimes use this
        // to fix the "extra space at the bottom" insanity
        var b = bounds
        let h = sizeThatFits(CGSize(
           width: bounds.size.width,
           height: CGFloat.greatestFiniteMagnitude)
       ).height
       b.size.height = h
       bounds = b
 ...

(2) কখনও কখনও, আরও একটি সূক্ষ্ম অ্যাপল মেস আপ আপ ঠিক করতে, আপনি এটি যুক্ত করতে হবে:

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) {
    super.setContentOffset(contentOffset, animated: false)
}

(3) যুক্তিযুক্তভাবে, আমাদের যুক্ত করা উচিত :

contentInset = UIEdgeInsets.zero

পরেই .lineFragmentPadding = 0মধ্যে UITextViewFixed

তবে ... বিশ্বাস করুন বা না করুন ... এটি বর্তমান আইওএসে কাজ করে না ! (2019 সালে চেক করা হয়েছে)) ভবিষ্যতে এই লাইনটি যুক্ত করা প্রয়োজন হতে পারে।

UITextViewআইওএস-এ ভাঙা তথ্যটি মোবাইল কম্পিউটারের সমস্ত কম্পিউটারের মধ্যে একটি উদ্ভট বিষয়। এই প্রশ্নের দশ বছরের বার্ষিকী এবং এটি এখনও স্থির হয়নি!

শেষ অবধি, পাঠ্য ক্ষেত্রের জন্য এখানে কিছুটা অনুরূপ পরামর্শ : https://stackoverflow.com/a/43099816/294884

সম্পূর্ণরূপে এলোমেলো টিপ: শেষে কীভাবে "..." যুক্ত করবেন

প্রায়শই আপনি "ইউআইএলবেলের মতো" ইউআইটিএক্সেক্সটভিউ ব্যবহার করছেন। সুতরাং আপনি চান যে এটি একটি উপবৃত্ত "..." ব্যবহার করে পাঠ্য কেটে ফেলুন

যদি তা হয় তবে "সেটআপ" এ কোডের তৃতীয় লাইন যুক্ত করুন:

 textContainer.lineBreakMode = .byTruncatingTail

আপনি যদি শূন্য উচ্চতা চান, তবে কখন কোনও পাঠ্য নেই, তা হ্যান্ডসেট টিপ

প্রায়শই আপনি কেবল পাঠ্য প্রদর্শন করতে একটি পাঠ্য দর্শন ব্যবহার করেন। সুতরাং, ব্যবহারকারী আসলে কিছু সম্পাদনা করতে পারবেন না। আপনি "0" রেখা ব্যবহার করে বোঝানোর জন্য পাঠ্য দর্শনটি পাঠ্যের কত লাইনের উপর নির্ভর করে স্বয়ংক্রিয়ভাবে উচ্চতা পরিবর্তন করবে।

এটি দুর্দান্ত, তবে যদি কোনও পাঠ্য না থাকে তবে দুর্ভাগ্যক্রমে আপনি একই উচ্চতা পাবেন যেন পাঠ্যের একটি লাইন থাকে !! পাঠ্য দর্শন কখনও "দূরে যায়"।

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

আপনি যদি এটি "চলে যেতে" চান তবে কেবল এটি যুক্ত করুন

override var intrinsicContentSize: CGSize {
    var i = super.intrinsicContentSize
    print("for \(text) size will be \(i)")
    if text == "" { i.height = 1.0 }
    print("   but we changed it to \(i)")
    return i
}

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

(আমি এটিকে '1' করেছি তাই এটি কী স্পষ্ট তা পরিষ্কার, '0' ঠিক আছে))

ইউআইলাবেল সম্পর্কে কি?

সবেমাত্র পাঠ্য প্রদর্শন করার সময়, ইউআইএলবেলের ইউআইটিেক্সটভিউয়ের থেকে অনেক সুবিধা রয়েছে। ইউআইএলবেল এই কিউএ পৃষ্ঠায় বর্ণিত সমস্যাগুলি থেকে ভোগেন না। প্রকৃতপক্ষে যে কারণে আমরা সবাই সাধারণত "হাল ছেড়ে" এবং কেবল ইউআইটিএক্সটভিউ ব্যবহার করি তা হ'ল ইউআইএলবেল কাজ করা কঠিন is বিশেষত ইউআইএলবেলে সঠিকভাবে প্যাডিং যুক্ত করা হাস্যকর বিষয়। বাস্তবে এখানে ইউআইএলবেলে কীভাবে "অবশেষে" প্যাডিং সঠিকভাবে যুক্ত করা যায় সে সম্পর্কে একটি সম্পূর্ণ আলোচনা এখানে রয়েছে: https://stackoverflow.com/a/58876988/294884 কিছু ক্ষেত্রে যদি আপনি গতিশীল উচ্চতার কোষগুলির সাথে একটি কঠিন বিন্যাস করে থাকেন তবে এটি কখনও কখনও হয় এটি ইউআইএলবেল দিয়ে কঠিন উপায়ে করা আরও ভাল।


1
আমি self.textView.isScrollEnabled = falseভিতরে করেছি viewDidLayoutSubviews()এবং এটি খুব কার্যকর। অ্যাপল কেবল আমাদের
হুপসের

1
গতিশীল উচ্চতা (ইউআইটিএবলভিউআউটমেটিক ডাইমেনশন) সহ আমার ইউআইটিএবলভিউ সেল, শিরোলেখ এবং পাদদেশে আমার সমস্ত অযৌক্তিক ইউআইটিএক্সেক্সটভিউ অটোলেআউট বাগগুলি ঠিক করার সেরা সমাধান। গ্রেট!
পিটার ক্রেইঞ্জ

1
আমি @ ফ্যাটির উত্তরের একটি আপডেট উত্তর পোস্ট করেছি যা আমাকে সক্ষম / অক্ষম করার বিশেষ কৌশলটি ব্যবহার করে সমস্ত কীটপতঙ্গ থেকে সত্যই মুক্তি পেতে সহায়তা করেছিল translatesAutoresizingMaskIntoConstraints। এই উত্তরের সাথে একা আমি অটো লেআউট ব্যবহার করে ভিউ হায়ারার্কিতে সমস্ত মার্জিনগুলি (কিছু বিস্ময়কর নীচের মার্জিন সরে যেতে প্রতিরোধ করা) সক্ষম করতে পারিনি was এটি ব্যবহার করে দেখার আকারের গণনার সাথেও যোগাযোগ করে systemLayoutSizeFitting, যা UITextView
বগির

1
আইবি ডিজাইনেবলের জন্য 1 আপ আমি খুব ভালভাবে নির্বাচিত স্থান ধারক
পাঠকের জন্যও উত্সাহ

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

790

আইওএস .0.০-এর জন্য, আমি খুঁজে পেয়েছি যে কন্টেন্টসেট ট্রিক আর কাজ করে না। আমি আইওএস 7 এর মার্জিন / প্যাডিং থেকে মুক্তি পেতে এই কোডটি ব্যবহার করি।

এটি পাঠকের বাম প্রান্তটি ধারকটির বাম প্রান্তে নিয়ে আসে:

textView.textContainer.lineFragmentPadding = 0

এর ফলে পাঠ্যের শীর্ষটি পাত্রে শীর্ষের সাথে একত্রিত হয়

textView.textContainerInset = .zero

উভয় লাইন সম্পূর্ণ মার্জিন / প্যাডিং অপসারণ করা প্রয়োজন are


2
এটি আমার জন্য দুটি লাইনের জন্য কাজ করছে, তবে আমি 5 টি লাইনে পৌঁছানোর সাথে সাথে পাঠটি কেটে ফেলা হচ্ছে।
livings124

7
নোট করুন যে দ্বিতীয় লাইনটিও এইভাবে লেখা যেতে পারে:self.descriptionTextView.textContainerInset = UIEdgeInsetsZero;
জেসিপিনহো

19
lineFragmentPadding0 এ সেট করা সেই যাদুটি আমি খুঁজছিলাম। অ্যাপল ইউআইটিেক্সটভিউ সামগ্রীতে অন্যান্য নিয়ন্ত্রণের সাথে লাইন তৈরি করা এত কঠিন করে কেন আমার কোনও ধারণা নেই।
phatmann

3
এটা সঠিক উত্তর. এই সমাধানের সাথে অনুভূমিকভাবে স্ক্রোলিং হয় না।
মাইকেল

2
lineFragmentPaddingমার্জিনগুলি সংশোধন করার উদ্দেশ্যে নয়। দস্তাবেজগুলি থেকে লাইন টুকরা প্যাডিং পাঠ্য মার্জিন প্রকাশ করার জন্য ডিজাইন করা হয়নি। পরিবর্তে, আপনার পাঠ্য দৃশ্যে কীটপতঙ্গ ব্যবহার করা উচিত, অনুচ্ছেদের মার্জিন বৈশিষ্ট্যগুলি সামঞ্জস্য করতে হবে, বা তার তত্ত্বাবধানের মধ্যে পাঠ্য দৃশ্যের অবস্থান পরিবর্তন করা উচিত।
মার্টিন বার্গার

256

আইওএস 3.0 প্রকাশিত হওয়ার পরে এই কর্মসূচীটি 2009 সালে লেখা হয়েছিল। এটি আর প্রযোজ্য নয়।

আমি ঠিক একই সমস্যার মধ্যে দৌড়েছি, শেষ পর্যন্ত আমাকে ব্যবহার করে শেষ করতে হয়েছিল

nameField.contentInset = UIEdgeInsetsMake(-4,-8,0,0);

যেখানে নাম ফিল্ড একটি UITextView। আমি যে ফন্টটি ব্যবহার করতে এসেছি তা হেলভেটিকা ​​16 পয়েন্ট। এটি নির্দিষ্ট ক্ষেত্রের আকারের জন্য আমি কেবল আঁকা একটি কাস্টম সমাধান। এটি বাম দিকের অফসেটটি বাম পাশ দিয়ে ফ্লাশ করে তোলে এবং শীর্ষে অফসেট যেখানে আমি এটির জন্য বক্সটি আঁকতে চাই want

UITextViewsতদতিরিক্ত, এটি কেবলমাত্র আপনি যেখানে ডিফল্ট অ্যালিগমেন্ট ব্যবহার করছেন সেখানে প্রযোজ্য বলে মনে হয় ।

nameField.textAlignment = NSTextAlignmentLeft;

উদাহরণস্বরূপ ডানদিকে সারিবদ্ধ করুন এবং UIEdgeInsetsMakeমনে হচ্ছে ডান প্রান্তের কোনও প্রভাব নেই।

খুব কমপক্ষে UITextViews


1
হ্যাঁ এটি আইওএস-এ কাজ করে 7.. নিশ্চিত করুন যে ইউআইএডজেইনেসটটি সঠিক মানগুলিতে সেট করা আছে। এটি ইউআইএডিজইনসেটস মেক (-4, -8,0,0) এর চেয়ে আলাদা হতে পারে।
অ্যাপ_

15
আইওএস 7-এ আমি পেয়েছি ইউআইইডিজইনসেটস মেক (0, -4,0, -4) সবচেয়ে ভাল কাজ করেছে।
রচুড়া

2
হ্যাঁ, সেগুলি উদাহরণ নম্বর। আমি বলেছিলাম "যে নির্দিষ্ট ক্ষেত্রের আকারটি আমি আঁকছিলাম এটির জন্য এটি কেবলমাত্র একটি কাস্টম সমাধান"। মূলত আমি চিত্রিত করার চেষ্টা করছিলাম যে আপনার অনন্য লেআউট পরিস্থিতির জন্য আপনাকে সংখ্যাগুলি নিয়ে খেলতে হবে।
মাইকেল 21

3
UITextAlignmentLeft iOS 7 এ অবমূল্যায়ন করা হয়েছে N এনএসটিেক্সটএলাইনমেন্টলিফ্ট ব্যবহার করুন।
জর্ডি ক্রুন

7
লোকেরা এমন কোনও উত্তরকে কেন আপডোট করে যা হার্ড-কোডড মানগুলি ব্যবহার করে তা আমি পাই না। ভবিষ্যতের আইওএসের সংস্করণগুলি ভেঙে যাওয়ার সম্ভাবনা খুব বেশি এবং এটি কেবল একটি সহজ ধারণা।
ldoogy

77

ইতিমধ্যে প্রদত্ত কয়েকটি ভাল উত্তর বন্ধ করে দেওয়া, এখানে একটি নিখুঁত স্টোরিবোর্ড / ইন্টারফেস বিল্ডার-ভিত্তিক সমাধান যা আইওএস 7.0+ এ কাজ করে

নিম্নলিখিত কিগুলির জন্য ইউআইটিেক্সটভিউর ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যগুলি সেট করুন :

textContainer.lineFragmentPadding
textContainerInset

ইন্টারফেস নির্মাতা


4
এটি স্পষ্টতই সেরা উত্তর, বিশেষত যদি আপনার XIB- সমাধানের প্রয়োজন হয়
yano

16
অনুলিপি / পেস্ট করুন: টেক্সট কন্টেইনার.লাইন ফ্রেমপ্যাডিং | TextContainerInset
লুকা ডি অ্যাঞ্জেলিস

3
এটিই একটি সুন্দর উত্তর তৈরি করে - 3 বছর পরেও সহজ এবং ভাল কাজ করে :)
শাই মিশালি


41

হার্ড-কোডেড মানগুলির সাথে জড়িত কোনও উত্তর আমি অবশ্যই এড়াতে পারব, কারণ ব্যবহারকারীর ফন্ট-আকারের সেটিংস ইত্যাদির সাথে প্রকৃত মার্জিনগুলি পরিবর্তিত হতে পারে etc.

এখানে @ user1687195 এর উত্তর, পরিবর্তন ছাড়া লেখা textContainer.lineFragmentPadding(কারণ ডক্স রাষ্ট্র এই উদ্দেশ্যে ব্যবহার নয়)।

এটি iOS 7 এবং তারপরেও দুর্দান্ত কাজ করে।

self.textView.textContainerInset = UIEdgeInsetsMake(
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding, 
                                      0, 
                                      -self.textView.textContainer.lineFragmentPadding);

এটি কার্যকরভাবে একই ফলাফল, এটি কেবল খানিকটা পরিষ্কার যে এটি লাইনফ্র্যাগমেন্টপ্যাডিং সম্পত্তিটির অপব্যবহার করে না।


আমি এই উত্তরের উপর ভিত্তি করে আরেকটি সমাধান চেষ্টা করেছি এবং এটি দুর্দান্ত কাজ করে। সমাধানগুলি হ'ল:self.textView.textContainer.lineFragmentPadding = 0;
বাকিত আবদ্রাসুলভ

1
@ বাক্যট্যাবদ্রাসুলভ দয়া করে আমার উত্তরটি পড়ুন। আপনার সমাধানটি কাজ করার সময়, এটি দস্তাবেজগুলির সাথে নয় (আমার উত্তরের লিঙ্কটি দেখুন)। lineFragmentPaddingমার্জিনগুলি নিয়ন্ত্রণ করার জন্য নয়। এজন্য আপনার ব্যবহার করার কথা textContainerInset
ldoogy

20

স্টোরবোর্ড বা ইন্টারফেস বিল্ডার সমাধান ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যগুলি ব্যবহার করে :

স্ক্রিনশটগুলি আইওএস 7.1 এবং আইওএস 6.1 এর সাথে রয়েছে contentInset = {{-10, -5}, {0, 0}}

ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য

আউটপুট


1
আইওএস
me-এ

কেবলমাত্র ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যের জন্য - দুর্দান্ত!
hris.to

16

এই সমস্ত উত্তর শিরোনাম প্রশ্নে সম্বোধন করে, তবে আমি ওপি-র প্রশ্নের শরীরে উপস্থাপিত সমস্যাগুলির জন্য কিছু সমাধান প্রস্তাব করতে চেয়েছিলাম।

পাঠ্য সামগ্রীর আকার

অভ্যন্তরের পাঠ্যের আকার গণনা করার একটি দ্রুত উপায় UITextViewহ'ল NSLayoutManager:

UITextView *textView;
CGSize textSize = [textView usedRectForTextContainer:textView.textContainer].size;

এটি মোট স্ক্রোলযোগ্য সামগ্রী দেয় যা এটির UITextViewফ্রেমের চেয়ে বড় হতে পারে । আমি এটি অনেক বেশি নির্ভুল বলে মনে করেছি textView.contentSizeযেহেতু এটি পাঠ্যের কতটা জায়গা নেয় তা গণনা করে। উদাহরণস্বরূপ, একটি খালি দেওয়া UITextView:

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

লাইনের উচ্চতা

UIFontএকটি সম্পত্তি আছে যা আপনাকে দ্রুত প্রদত্ত ফন্টের জন্য লাইন উচ্চতা পেতে দেয়। সুতরাং আপনি আপনার UITextViewসাথে টেক্সটের রেখার উচ্চতাটি দ্রুত খুঁজে পেতে পারেন :

UITextView *textView;
CGFloat lineHeight = textView.font.lineHeight;

দৃশ্যমান পাঠ্যের আকার গণনা করা হচ্ছে

"পেজিং" প্রভাবটি পরিচালনা করার জন্য যে পাঠ্যটি আসলে দৃশ্যমান তা নির্ধারণ করা গুরুত্বপূর্ণ। প্রকৃতপক্ষে প্রকৃত এবং পাঠ্যের মধ্যে একটি প্রান্তিক UITextViewবলে পরিচিত একটি সম্পত্তি রয়েছে । দৃশ্যমান ফ্রেমের আসল উচ্চতা গণনা করতে আপনি নিম্নলিখিত গণনাগুলি সম্পাদন করতে পারেন:textContainerInsetUITextView.frame

UITextView *textView;
CGFloat textViewHeight = textView.frame.size.height;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textHeight = textViewHeight - textInsets.top - textInsets.bottom;

পেজিংয়ের আকার নির্ধারণ করা হচ্ছে

শেষ অবধি, এখন আপনার কাছে দৃশ্যমান পাঠ্যের আকার এবং সামগ্রী রয়েছে তাই আপনি খুব দ্রুত নির্ধারণ করতে পারেন যে আপনার অফসেটগুলি কী হতে হবে তা textHeightথেকে বিয়োগ করে textSize:

// where n is the page number you want
CGFloat pageOffsetY = textSize - textHeight * (n - 1);
textView.contentOffset = CGPointMake(textView.contentOffset.x, pageOffsetY);

// examples
CGFloat page1Offset = 0;
CGFloat page2Offset = textSize - textHeight
CGFloat page3Offset = textSize - textHeight * 2

এই সমস্ত পদ্ধতি ব্যবহার করে, আমি আমার পোকামাকড় স্পর্শ করি নি এবং আমি ক্যারেটে বা আমার পাঠ্যটিতে যেখানেই যেতে চাই।


12

আপনি এর textContainerInsetসম্পত্তি ব্যবহার করতে পারেন UITextView:

TextView.textContainerInset = UIEdgeInsetsMake (10, 10, 10, 10);

(উপরে, বাম, নীচে, ডান)


1
আমি কেন এখানে সেরা উত্তর হিসাবে নিযুক্ত করা হয় তা অবাক। টেক্সট কনটেনারইনসেটটি সত্যই আমার চাহিদা পূরণ করেছে।
কোরিয়ানএক্সকোড ওয়ার্কার

textContainerInsetসম্পত্তির নীচের মানটি আপডেট করা আমার পক্ষে কাজ করছে না যখন আমি এটিকে নতুন মূল্যে পরিবর্তন করতে চাই — দেখুন স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১৯৪২২২7878৮ /
ইভান আর

@ ম্যাগজিফিলিপস এটি সেরা উত্তর নয় কারণ হার্ডকডযুক্ত মানগুলি সম্ভবত এটি করার সঠিক উপায় হতে পারে না এবং কিছু ক্ষেত্রে এটি ব্যর্থ হওয়ার গ্যারান্টিযুক্ত। আপনার অ্যাকাউন্টে লাইনফ্রেগমেন্টপ্যাডিং নেওয়া দরকার।
ldoogy

11

আইওএস 10 এর জন্য নীচের লাইনটি উপরের এবং নীচের প্যাডিং অপসারণের জন্য কাজ করে।

captionTextView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

এক্সকোড 8.2.1। এখনও এই উত্তর হিসাবে উল্লিখিত একই সমস্যা। আমার সমাধানটি হ'ল UIEgegeInsets হিসাবে মানগুলি সম্পাদনা করা (শীর্ষ: 0, বাম: -4.0, নীচে: 0, ডান: -4.0)।
Darkwonder

UIEdgeInset.zeroএক্সকোড 8.3 এবং আইওএস 10.3 সিমুলেটর ব্যবহার করে কাজ করে
সাইমন ওয়ার্টা

10

সর্বশেষ সুইফট:

self.textView.textContainerInset = .init(top: -2, left: 0, bottom: 0, right: 0)
self.textView.textContainer.lineFragmentPadding = 0

দুর্দান্ত উত্তর। এই উত্তরটি অতিরিক্ত শীর্ষ ইনসেটটি সরিয়ে দেয়। টেক্সটভিউ.টেক্সটকন্টেইনারআইনেসেট = ইউআইইডিজইনসেটস.জারো শীর্ষ ইনসেট থেকে 2 পিক্সেল সরায় না।
korgx9

10

এখানে ফ্যাটির অত্যন্ত সহায়ক উত্তরের একটি আপডেট সংস্করণ is এটি 2 টি গুরুত্বপূর্ণ লাইন যুক্ত করেছে যা আইওএস 10 এবং 11 এ লেআউটটি কাজ করতে সহায়তা করেছে (এবং সম্ভবত নিম্নের উপরও):

@IBDesignable class UITextViewFixed: UITextView {
    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }
    func setup() {
        translatesAutoresizingMaskIntoConstraints = true
        textContainerInset = UIEdgeInsets.zero
        textContainer.lineFragmentPadding = 0
        translatesAutoresizingMaskIntoConstraints = false
    }
}

গুরুত্বপূর্ণ লাইন দুটি translatesAutoresizingMaskIntoConstraints = <true/false>বিবৃতি!

এটি আশ্চর্যজনকভাবে আমার সমস্ত পরিস্থিতিতে মার্জিনকে সরিয়ে দেয় !

যদিও এটি textViewপ্রথম প্রতিক্রিয়াকারী নয় তবে এটি ঘটতে পারে যে কিছু অদ্ভুত নীচের মার্জিন রয়েছে যা sizeThatFitsগ্রহণযোগ্য উত্তরে উল্লিখিত পদ্ধতিটি ব্যবহার করে সমাধান করা যায় না ।

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

সুতরাং আমি এখানে এসওতে পড়েছিলাম যে translatesAutoresizingMaskIntoConstraintsকলগুলির মধ্যে ম্যানুয়ালি ফ্রেম / বাউন্ডস সেট করার সময় সক্ষম ও অক্ষম করা সহায়তা করে।

ভাগ্যক্রমে এটি কেবল ফ্রেম সেটিংয়ের সাথেই নয় setup()তবে দুটি translatesAutoresizingMaskIntoConstraintsকলের মধ্যে স্যান্ডউইচডের 2 টি লাইনের সাথে কাজ করে !

উদাহরণস্বরূপ এটি ব্যবহার করে একটি দৃশ্যের ফ্রেম গণনা করার সময় এটি খুব সহায়ক । সঠিক আকার ফিরিয়ে দেয় (যা আগে তা হয়নি)!systemLayoutSizeFittingUIView

উল্লিখিত মূল উত্তরের মতো:
পরিদর্শকটিতে সক্রিয় স্ক্রোলটি বন্ধ করতে ভুলবেন না!
এই সমাধানটি স্টোরিবোর্ডে পাশাপাশি রানটাইমেও সঠিকভাবে কাজ করে।

এটি এখন, আপনি সত্যিই সম্পন্ন হয়েছে!


5

সুইফ্ট 4, এক্সকোড 9 এর জন্য

নিম্নলিখিত ফাংশনটি ব্যবহার করুন ইউআইটিেক্সটভিউতে পাঠ্যের মার্জিন / প্যাডিং পরিবর্তন করতে পারে

পাবলিক ফানক ইউআইইডিজইনসেটস মেক (_ শীর্ষ: সিজিফ্লোট, _ বাম: সিজিফ্লোট, _ নীচে: সিজিফ্লোট, _ ডান: সিজিফ্লোট) -> ইউআইএডিজইনসেটস

তাই এই ক্ষেত্রে হয়

 self.textView?.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0)

3

ইনসেট সলিউশনটি করাতে আমার ডান পাশ এবং নীচে প্যাডিং ছিল। এছাড়াও পাঠ্য প্রান্তিককরণ সমস্যার কারণ ছিল। আমি খুঁজে পাওয়া একমাত্র নিশ্চিত আগুনের পথটি ছিল পাঠ্যের দর্শনটিকে অন্য দৃশ্যের ভিতরে সীমাবদ্ধ করে দেওয়া।


3

এখানে একটি সহজ ছোট এক্সটেনশান যা আপনার অ্যাপ্লিকেশনের প্রতিটি পাঠ্য দর্শন থেকে অ্যাপলের ডিফল্ট মার্জিনটি সরিয়ে ফেলবে।

দ্রষ্টব্য: ইন্টারফেস বিল্ডার এখনও পুরানো মার্জিন প্রদর্শন করবে, তবে আপনার অ্যাপটি প্রত্যাশার মতো কাজ করবে।

extension UITextView {

   open override func awakeFromNib() {
      super.awakeFromNib();
      removeMargins();
   }

   /** Removes the Apple textview margins. */
   public func removeMargins() {
      self.contentInset = UIEdgeInsetsMake(
         0, -textContainer.lineFragmentPadding,
         0, -textContainer.lineFragmentPadding);
   }
}

1

আমার জন্য (আইওএস 11 এবং এক্সকোড 9.4.1) যা জাদুকরভাবে কাজ করেছিল তা হ'ল টেক্সটভিউ.ফন্টের সম্পত্তিটিকে UIFont.preferred(forTextStyle:UIFontTextStyle) স্টাইলে সেট করা এবং @ ফ্যাটি দ্বারা উল্লিখিত প্রথম উত্তরটিও ছিল। তবে আমি ফ্যাটি উত্তরটি কাজ করে না যতক্ষণ না আমি টেক্সটভিউ.ফন্টের সম্পত্তি সেট করি অন্যথায় ইউআইটিেক্সটভিউ ভুলভাবে আচরণ করে চলে।


1

যদি কেউ সর্বশেষতম সুইফ্ট সংস্করণটি সন্ধান করে তবে নীচের কোডটি কোডটি Xcode 10.2 এবং সুইফট 4.2 দিয়ে সূক্ষ্মভাবে কাজ করছে

yourTextView.textContainerInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

0

আমি আরও একটি পদ্ধতির সন্ধান পেয়েছি, ইউআইটিেক্সটভিউর সাবউভিউ থেকে পাঠ্যের সাথে ভিউ পেয়েছি এবং একটি সাবক্লাসের লেআউটসুবিউ পদ্ধতিতে সেট আপ করছি:

- (void)layoutSubviews {
    [super layoutSubviews];

    const int textViewIndex = 1;
    UIView *textView = [self.subviews objectAtIndex:textViewIndex];
    textView.frame = CGRectMake(
                                 kStatusViewContentOffset,
                                 0.0f,
                                 self.bounds.size.width - (2.0f * kStatusViewContentOffset),
                                 self.bounds.size.height - kStatusViewContentOffset);
}

0

টেক্সটভিউ স্ক্রোলিং পাঠ্যের অবস্থানকেও প্রভাবিত করে এবং এটি উল্লম্বভাবে কেন্দ্রিক নয় বলে মনে হচ্ছে। আমি স্ক্রোলিংটি অক্ষম করে এবং শীর্ষের ইনসেটটি 0 এ সেট করে ভিউটিতে পাঠ্যটি কেন্দ্র করে নিয়েছি:

    textView.scrollEnabled = NO;
    textView.textContainerInset = UIEdgeInsetsMake(0, textView.textContainerInset.left, textView.textContainerInset.bottom, textView.textContainerInset.right);

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


0

আপনি যদি এইচটিএমএল স্ট্রিং সেট করতে চান এবং নীচের প্যাডিং এড়াতে চান তবে দয়া করে নিশ্চিত হয়ে নিন যে আপনি ব্লক ট্যাগ ব্যবহার করছেন না যেমন ডিভ, পি।

আমার ক্ষেত্রে এই কারণ ছিল। ব্ল্যাক ট্যাগগুলির সংস্থানগুলি স্প্যান ট্যাগের পরিবর্তে আপনি সহজেই এটি পরীক্ষা করে দেখতে পারেন।


0

SwiftUI এর জন্য

আপনি যদি নিজের ফাংশনটিতে নিজের টেক্সটভিউ ব্যবহার করে UIViewRepresentableএবং প্যাডিং নিয়ন্ত্রণ করতে চান তবে makeUIViewকেবল করুন:

uiTextView.textContainerInset = UIEdgeInsets(top: 10, left: 18, bottom: 0, right: 18)

অথবা আপনি যা চান


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.