ইউআইটিেক্সটভিউ যা স্বয়ংক্রিয় বিন্যাস ব্যবহার করে পাঠ্যে প্রসারিত হয়


163

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

আমি কীভাবে এটি "স্প্রিংস এবং স্ট্রুটস" উপায়ে করতে জানি, তবে এটি করার কোনও স্বয়ংক্রিয় বিন্যাস উপায় আছে কি? আমি ভাবতে পারি একমাত্র উপায় হ'ল প্রতিবারই যখন বাড়ার দরকার হয় তখন সীমাবদ্ধতা সরিয়ে এবং পুনরায় যুক্ত করা।


5
আপনি পাঠ্য দর্শনটির জন্য উচ্চতা বাধার জন্য একটি আইবিআউটলেট তৈরি করতে পারেন, এবং যখন আপনি এটি বাড়তে চান কেবল ধ্রুবকটি সংশোধন করুন, অপসারণ এবং যোগ করার দরকার নেই।
rdelmar

4
2017, একটি বিরাট টিপ যা আপনাকে প্রায়শই ধরে রাখে: এটি শুধুমাত্র কাজ করে যদি আপনি ভিউডিডের পরে এটি সেট করেন > দেখান < আপনি যদি ভিডিডলয়েডে লেখাটি সেট করেন তবে এটি খুব হতাশাব্যঞ্জক - এটি কার্যকর হবে না!
ফ্যাটি

2
ডগা No2:;) যদি আপনি কল [someView.superView layoutIfNeeded] অতঃপর viewWillAppear () কাজ করতে পারে
Yaro

উত্তর:


30

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

_descriptionHeightConstraint = [NSLayoutConstraint constraintWithItem:_descriptionTextView
                                 attribute:NSLayoutAttributeHeight 
                                 relatedBy:NSLayoutRelationEqual 
                                    toItem:nil 
                                 attribute:NSLayoutAttributeNotAnAttribute 
                                multiplier:0.f 
                                 constant:100];

[self addConstraint:_descriptionHeightConstraint];

ইন setBoundsপদ্ধতি, আমি তখন ধ্রুবক এর মান পরিবর্তন করা হয়েছে।

-(void) setBounds:(CGRect)bounds
{
    [super setBounds:bounds];

    _descriptionTextView.frame = bounds;
    CGSize descriptionSize = _descriptionTextView.contentSize;

    [_descriptionHeightConstraint setConstant:descriptionSize.height];

    [self layoutIfNeeded];
}

4
আপনি ইউআইটিেক্সটভিউ ডেডেলিগেটের 'টেক্সটভিউডিড চ্যাঞ্জ:' তেও সীমাবদ্ধতা আপডেট করতে পারেন
এলকে__

2
সুন্দর সমাধান। নোট করুন যে আপনি ইন্টারফেস বিল্ডারেও সীমাবদ্ধতা তৈরি করতে এবং একটি আউটলেট ব্যবহার করে এটি সংযোগ করতে পারেন। এটি ব্যবহার করে সম্মিলিতভাবে textViewDidChangeকিছু ঝামেলা সাবক্লাসিং এবং রাইটিং কোডটি সংরক্ষণ করা উচিত ...
বব ভর্ক

3
মনে রাখবেন যে textViewDidChange:ইউআইটিেক্সটভিউ প্রোগ্রামে টেক্সট যুক্ত করার সময় কল করা হবে না।
ভ্রমণের উদগ্র আকাঙ্ক্ষা

@BoyVork পরামর্শটি XCODE 11 / iOS13 ভালভাবে কাজ করে, যখন পাঠ্য ভিউয়ের মানটি ভিউওয়াল অ্যাপায়ারে সেট করা হয় এবং টেক্সটভিউডিড চেঞ্জে আপডেট হয় তখন সীমাবদ্ধতার ধ্রুবক সেট করে।
পিটিসি

549

সংক্ষিপ্তসার: আপনার পাঠ্য দৃশ্যের স্ক্রোলিং অক্ষম করুন এবং এর উচ্চতা বাধা দেবেন না।

প্রোগ্রামগতভাবে এটি করতে, নিম্নলিখিত কোডটি এতে রাখুন viewDidLoad:

let textView = UITextView(frame: .zero, textContainer: nil)
textView.backgroundColor = .yellow // visual debugging
textView.isScrollEnabled = false   // causes expanding height
view.addSubview(textView)

// Auto Layout
textView.translatesAutoresizingMaskIntoConstraints = false
let safeArea = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
    textView.topAnchor.constraint(equalTo: safeArea.topAnchor),
    textView.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor),
    textView.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor)
])

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

দ্রষ্টব্য: আপনার পাঠ্য দর্শনের উপরে / নীচে যদি আপনার অন্য ভিউ / গুলি থাকে তবে UIStackViewসেগুলি সাজানোর জন্য একটি ব্যবহার করে বিবেচনা করুন।


12
আমার জন্য কাজ করে (আইওএস 7 @ এক্সকোড 5) সাবধানবাণীটি হ'ল আইবিতে কেবল "স্ক্রোলিং সক্ষম" অনিচ্ছুক সাহায্য করবে না। আপনি প্রোগ্রামক্রমে এটি করতে হবে।
কেনেথ জিয়াং

10
আমি কীভাবে পাঠ্য দৃশ্যে সর্বাধিক উচ্চতা নির্ধারণ করব এবং এরপরে তার লিখিত পাঠ্য প্রদর্শনের উচ্চতা ছাড়িয়ে যাওয়ার পরে পাঠ্য ভিউটিকে স্ক্রোল করতে পাব?
ma11 শেই 28

3
@ আইওএসগিক কেবল একটি ইউআইটিএক্সেক্সটভিউ সাবক্লাস তৈরি করুন এবং এর intrinsicContentSizeমতো ওভাররাইট করুন - (CGSize)intrinsicContentSize { CGSize size = [super intrinsicContentSize]; if (self.text.length == 0) { size.height = UIViewNoIntrinsicMetric; } return size; }। যদি এটি আপনার পক্ষে কাজ করে তবে আমাকে বলুন। নিজে পরীক্ষা করিনি।
ম্যানুয়েলওয়াল্ডনার

1
এই সম্পত্তিটি সেট করুন এবং ইউআইএসট্যাকভিউতে ইউআইটিএক্সটেক্স ভিউ রাখুন। ভোইলা - স্ব-আকার পরিবর্তনকারী পাঠ্যদর্শন দেখুন!)
নিক কোভ

3
এই উত্তরটি সোনার। এক্সকোড 9 এর সাহায্যে আপনি আইবিতে চেকবক্সটি অক্ষম করে রাখলে এটিও কাজ করে।
বায়ো

48

এখানে এমন লোকদের জন্য একটি সমাধান রয়েছে যা অটো লেআউট দ্বারা এটি সব করতে পছন্দ করে:

আকার পরিদর্শক:

  1. সামগ্রী সংক্ষেপণ প্রতিরোধের অগ্রাধিকারটি 1000 এ সেট করুন।

  2. সীমাবদ্ধতায় "সম্পাদনা করুন" ক্লিক করে সীমাবদ্ধ উচ্চতার অগ্রাধিকারটিকে কম করুন। এটি 1000 এরও কম তৈরি করুন।

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

বৈশিষ্ট্য পরিদর্শক:

  1. "স্ক্রোলিং সক্ষম করা" আনচেক করুন

এটি নিখুঁতভাবে কাজ করছে। আমি উচ্চতা সেট না। ইউআইটেক্সটভিউয়ের উল্লম্ব সংকোচনের প্রতিরোধের অগ্রাধিকার 1000 বাড়ানো কেবলমাত্র প্রয়োজনীয় ছিল। ইউআইটেক্সটভিউতে কিছু ইনসেট রয়েছে, এ কারণেই অটোলেআউট ত্রুটি দেয় কারণ ইউআইটেক্সটভিউতে কমপক্ষে 32 উচ্চতার প্রয়োজন হবে, এমনকি যদি কোনও সামগ্রী এতে না থাকে, এমনকি যখন স্ক্রোলিং অক্ষম থাকে।
এনআর 5

আপডেট: আপনি উচ্চতা সর্বনিম্ন 20 বা অন্য যে কোনও কিছু হতে চান যদি উচ্চতা সীমাবদ্ধতা প্রয়োজন। অন্যান্য বুদ্ধিমান 32 ন্যূনতম উচ্চতা হিসাবে বিবেচিত হবে।
এনআর 5

@ নীল খুশী এটি শুনে সাহায্য করে।
মাইকেল রেভলিস

@ মিশেল রেভেলিস, এটি দুর্দান্ত কাজ করে। তবে যখন একটি বড় পাঠ্য থাকে তখন পাঠ্যটি প্রদর্শিত হয় না। আপনি অন্যান্য প্রক্রিয়াকরণ করতে পাঠ্য নির্বাচন করতে পারেন তবে এটি দৃশ্যমান নয়। আপনি কি আমাকে এটি সাহায্য করতে পারেন? ? যখন আমি স্ক্রোলিং সক্ষম বিকল্পটি চেক করি তখনই এটি ঘটে। আমি যখন পাঠ্যদর্শনটি স্ক্রোলিং সক্ষম করে তুলি তখন এটি পুরোপুরি প্রদর্শিত হয় তবে আমি চাই পাঠ্য দর্শনটি স্ক্রোল না করে।
ভুতিক জিনিয়া

@ ভৌতিকজিনিয়া, আপনি কি একটি বাস্তব ডিভাইসে আপনার অ্যাপ্লিকেশনটি তৈরি করার চেষ্টা করেছেন? আমি মনে করি এটি সম্ভবত বাগ প্রদর্শনকারী একটি সিমুলেটর হতে পারে। আমার পাঠ্য ফন্টের আকার 100 সহ একটি ইউআইটিএক্সটভিউ রয়েছে It এটি একটি সত্য ডিভাইসে সূক্ষ্মভাবে প্রদর্শিত হয় তবে পাঠ্যগুলি সিমুলেটারে অদৃশ্য।
মাইকেল রেভলিস

38

ইউআইটিেক্সটভিউ অন্তর্নিহিত কনসেন্টসাইজ সরবরাহ করে না, তাই আপনাকে এটি সাবক্লাস করে একটি সরবরাহ করতে হবে। এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পেতে, লেআউটসুভিউগুলিতে অন্তর্নিহিত কনটেন্টসাইজটিকে অবৈধ করুন। আপনি যদি ডিফল্ট কনটেন্টইনসেট (যা আমি প্রস্তাব দিই না) ব্যতীত অন্য কোনও কিছু ব্যবহার করেন তবে আপনার ইন্টারসনিকসেন্টসাইজ গণনা সামঞ্জস্য করতে হতে পারে।

@interface AutoTextView : UITextView

@end

#import "AutoTextView.h"

@implementation AutoTextView

- (void) layoutSubviews
{
    [super layoutSubviews];

    if (!CGSizeEqualToSize(self.bounds.size, [self intrinsicContentSize])) {
        [self invalidateIntrinsicContentSize];
    }
}

- (CGSize)intrinsicContentSize
{
    CGSize intrinsicContentSize = self.contentSize;

    // iOS 7.0+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
        intrinsicContentSize.width += (self.textContainerInset.left + self.textContainerInset.right ) / 2.0f;
        intrinsicContentSize.height += (self.textContainerInset.top + self.textContainerInset.bottom) / 2.0f;
    }

    return intrinsicContentSize;
}

@end

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

এটি দুর্দান্তভাবে কাজ করে। মজার বিষয় হল setScrollEnabled:এটি সর্বদা সেট করতে ওভাররাইড করার NOসময় আপনি একটি ক্রমবর্ধমান অভ্যন্তরীণ সামগ্রীর আকারের জন্য একটি অসীম লুপ পাবেন।
পাসকাল

আইওএস 7.0, আমি এছাড়াও কল করা প্রয়োজন [textView sizeToFit]মধ্যে textViewDidChange:প্রতিনিধি কলব্যাক অটো লেআউট হত্তয়া বা textview সঙ্কুচিত জন্য (এবং কোন নির্ভরশীল সীমাবদ্ধতার পুনঃগণনা) প্রতিটি কীস্ট্রোক পরে।
ফেব্রুবেন

6
আইওএস 7.1- এ এটি আর প্রয়োজন হবে না বলে মনে হয় পিছনের দিকের সামঞ্জস্যতা ঠিক করতে এবং শর্তটি -(void)layoutSubviews-(CGSize)intrinsicContentSizeversion >= 7.0f && version < 7.1felse return [super intrinsicContentSize];
ডেভিড জেমস

1
@ ডেভিডজেমস এটি এখনও আইওএস 7.1.2 এ প্রয়োজনীয়, আপনি জানেন না আপনি কোথায় পরীক্ষা করছেন।
সফটলিয়ন

27

আপনি স্টোরিবোর্ডের মাধ্যমে এটি করতে পারেন, কেবল "স্ক্রোলিং সক্ষম" অক্ষম করুন :)

স্টোরিবোর্ড


2
এই প্রশ্নের সর্বোত্তম উত্তর
ইভান বাইলকো

আপনি অটো লেআউট নিয়ে কাজ করার সময় এটিই সেরা সমাধান।
জানোপোথেকার

1
স্বতঃ লেআউট সেটিংস (শীর্ষস্থানীয়, ট্রেলিং, শীর্ষ, নীচে, কোনও উচ্চতা / প্রস্থ ) + স্ক্রোলিং অক্ষম। এবং আপনি সেখানে যান। ধন্যবাদ!
ফারহান আরশাদ

15

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

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

import UIKit

class FlexibleTextView: UITextView {
    // limit the height of expansion per intrinsicContentSize
    var maxHeight: CGFloat = 0.0
    private let placeholderTextView: UITextView = {
        let tv = UITextView()

        tv.translatesAutoresizingMaskIntoConstraints = false
        tv.backgroundColor = .clear
        tv.isScrollEnabled = false
        tv.textColor = .disabledTextColor
        tv.isUserInteractionEnabled = false
        return tv
    }()
    var placeholder: String? {
        get {
            return placeholderTextView.text
        }
        set {
            placeholderTextView.text = newValue
        }
    }

    override init(frame: CGRect, textContainer: NSTextContainer?) {
        super.init(frame: frame, textContainer: textContainer)
        isScrollEnabled = false
        autoresizingMask = [.flexibleWidth, .flexibleHeight]
        NotificationCenter.default.addObserver(self, selector: #selector(UITextInputDelegate.textDidChange(_:)), name: Notification.Name.UITextViewTextDidChange, object: self)
        placeholderTextView.font = font
        addSubview(placeholderTextView)

        NSLayoutConstraint.activate([
            placeholderTextView.leadingAnchor.constraint(equalTo: leadingAnchor),
            placeholderTextView.trailingAnchor.constraint(equalTo: trailingAnchor),
            placeholderTextView.topAnchor.constraint(equalTo: topAnchor),
            placeholderTextView.bottomAnchor.constraint(equalTo: bottomAnchor),
        ])
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override var text: String! {
        didSet {
            invalidateIntrinsicContentSize()
            placeholderTextView.isHidden = !text.isEmpty
        }
    }

    override var font: UIFont? {
        didSet {
            placeholderTextView.font = font
            invalidateIntrinsicContentSize()
        }
    }

    override var contentInset: UIEdgeInsets {
        didSet {
            placeholderTextView.contentInset = contentInset
        }
    }

    override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize

        if size.height == UIViewNoIntrinsicMetric {
            // force layout
            layoutManager.glyphRange(for: textContainer)
            size.height = layoutManager.usedRect(for: textContainer).height + textContainerInset.top + textContainerInset.bottom
        }

        if maxHeight > 0.0 && size.height > maxHeight {
            size.height = maxHeight

            if !isScrollEnabled {
                isScrollEnabled = true
            }
        } else if isScrollEnabled {
            isScrollEnabled = false
        }

        return size
    }

    @objc private func textDidChange(_ note: Notification) {
        // needed incase isScrollEnabled is set to true which stops automatically calling invalidateIntrinsicContentSize()
        invalidateIntrinsicContentSize()
        placeholderTextView.isHidden = !text.isEmpty
    }
}

বোনাস হিসাবে ইউআইএলবেলের অনুরূপ স্থানধারক পাঠ্য অন্তর্ভুক্ত করার জন্য সমর্থন রয়েছে।


7

আপনি সাবক্লাসিং ছাড়াই এটি করতে পারেন UITextView। কটাক্ষপাত আছে আমি কিভাবে আইওএস 7 এর বিষয়বস্তু করার জন্য একটি UITextView মাপ করবেন আমার উত্তর দিয়েছিলেন?

এই অভিব্যক্তিটির মানটি ব্যবহার করুন:

[textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height

আপডেট করার জন্য constantএর textView'র উচ্চতা UILayoutConstraint


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

আপনি যদি নিজে নিজেই প্রস্থ সেট করতে চান তবে স্ক্রোলএএনবেবলড = কোনও ট্রিকের চেয়ে আমি এটিকে আরও সাধারণভাবে দরকারী বলে মনে করেছি।
jchnxu

3

একটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করুন:

যেহেতু ইউআইটিসেক্সটভিউ ইউআইএসক্রোলভিউর একটি সাবক্লাস, তাই এটি ইউআইভিউকন্ট্রোলারের স্বয়ংক্রিয়ভাবে অ্যাডজাস্টসক্রোলভিউআইনসেটস সম্পত্তির অধীন।

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

সুতরাং অটো লেআউট এবং পাঠ্য দর্শনগুলির সাথে যদি আপনার সমস্যা হয়, automaticallyAdjustsScrollViewInsets = falseতবে ভিউ কন্ট্রোলারের সাথে সেট করার চেষ্টা করুন বা পাঠক্রমকে হায়ারার্কিতে এগিয়ে নিয়ে যাওয়ার চেষ্টা করুন।


2

এটি একটি খুব গুরুত্বপূর্ণ মন্তব্য

ভিটামিন ওয়াটারের উত্তরগুলি কেন কাজ করে তা বোঝার মূল বিষয়:

  1. জেনে রাখুন যে ইউআইটিেক্সটভিউ হল ইউআইএসক্রোলভিউ ক্লাসের একটি সাবক্লাস
  2. স্ক্রোলভিউ কীভাবে কাজ করে এবং কীভাবে এর বিষয়বস্তুর আকার গণনা করা হয় তা বুঝুন। আরও তথ্যের জন্য এখানে উত্তর এবং এর বিভিন্ন সমাধান এবং মন্তব্য দেখুন।
  3. কন্টেন্টসাইজ কী এবং কীভাবে এটি গণনা করা হয়েছে তা বুঝুন। দেখুন এখানে এবং এখানে । এছাড়া সাহায্য হতে পারে সেটিং contentOffsetহয় সম্ভবত কিছুই কিন্তু:

func setContentOffset(offset: CGPoint)
{
    CGRect bounds = self.bounds
    bounds.origin = offset
    self.bounds = bounds
}

আরও তথ্যের জন্য অবজেক্ট স্ক্রোলভিউ এবং স্ক্রোলভিউ বোঝার জন্য


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

এটি হওয়ার জন্য আপনাকে স্ক্রোলিংটি অক্ষম করতে হবে যা মূলত স্ক্রোলভিউয়ের আকার, বিষয়বস্তুর আকারের আকার এবং কোনও ধারকভিউ যুক্ত করার ক্ষেত্রে, তারপরে কনটেইনারভিউয়ের আকারটি একই রকম হবে। যখন তারা একই হয় আপনার কোনও স্ক্রোলিং নেই। এবং আপনি চাইতেন । থাকার অর্থ আপনি স্ক্রোল করেননি। এক পয়েন্টও নিচে নয়! ফলস্বরূপ পাঠ্য ভিউ সমস্ত প্রসারিত হবে।0 contentOffset0 contentOffSet

এটি স্ক্রোলভিউয়ের সীমানা এবং ফ্রেমটি একরকম হওয়ার অর্থ এটিও মূল্যবান নয় । আপনি যদি 5 টি পয়েন্ট স্ক্রোল করে থাকেন তবে আপনার সামগ্রীর অফসেটটি হবে , যখন আপনার সমান হবে0 contentOffset5scrollView.bounds.origin.y - scrollView.frame.origin.y5


1

প্লাগ এবং প্লে সলিউশন - এক্সকোড 9

স্বয়ংক্রিয়-বহির্বিন্যাস ঠিক UILabel, সঙ্গে লিংক সনাক্তকরণ , পাঠ্য নির্বাচন , সম্পাদনা এবং স্ক্রলিং এর UITextView

স্বয়ংক্রিয়ভাবে পরিচালনা করে

  • সুরক্ষিত এলাকা
  • সামগ্রী পোকামাকড়
  • লাইন টুকরা প্যাডিং
  • পাঠ্য পাত্রে পোকামাকড়
  • সীমাবদ্ধতাসমূহ
  • স্ট্যাক দর্শন
  • গুণযুক্ত স্ট্রিং
  • যাই হোক.

এই উত্তরগুলির অনেকগুলি আমাকে সেখানে 90% পেয়েছিল তবে কোনওটিই বোকা-প্রমাণ ছিল না।

এই UITextViewসাবক্লাসে ফেলে দিন এবং আপনি ভাল।


#pragma mark - Init

- (instancetype)initWithFrame:(CGRect)frame textContainer:(nullable NSTextContainer *)textContainer
{
    self = [super initWithFrame:frame textContainer:textContainer];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self commonInit];
    }
    return self;
}

- (void)commonInit
{
    // Try to use max width, like UILabel
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
    
    // Optional -- Enable / disable scroll & edit ability
    self.editable = YES;
    self.scrollEnabled = YES;
    
    // Optional -- match padding of UILabel
    self.textContainer.lineFragmentPadding = 0.0;
    self.textContainerInset = UIEdgeInsetsZero;
    
    // Optional -- for selecting text and links
    self.selectable = YES;
    self.dataDetectorTypes = UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber | UIDataDetectorTypeAddress;
}

#pragma mark - Layout

- (CGFloat)widthPadding
{
    CGFloat extraWidth = self.textContainer.lineFragmentPadding * 2.0;
    extraWidth +=  self.textContainerInset.left + self.textContainerInset.right;
    if (@available(iOS 11.0, *)) {
        extraWidth += self.adjustedContentInset.left + self.adjustedContentInset.right;
    } else {
        extraWidth += self.contentInset.left + self.contentInset.right;
    }
    return extraWidth;
}

- (CGFloat)heightPadding
{
    CGFloat extraHeight = self.textContainerInset.top + self.textContainerInset.bottom;
    if (@available(iOS 11.0, *)) {
        extraHeight += self.adjustedContentInset.top + self.adjustedContentInset.bottom;
    } else {
        extraHeight += self.contentInset.top + self.contentInset.bottom;
    }
    return extraHeight;
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    
    // Prevents flashing of frame change
    if (CGSizeEqualToSize(self.bounds.size, self.intrinsicContentSize) == NO) {
        [self invalidateIntrinsicContentSize];
    }
    
    // Fix offset error from insets & safe area
    
    CGFloat textWidth = self.bounds.size.width - [self widthPadding];
    CGFloat textHeight = self.bounds.size.height - [self heightPadding];
    if (self.contentSize.width <= textWidth && self.contentSize.height <= textHeight) {
        
        CGPoint offset = CGPointMake(-self.contentInset.left, -self.contentInset.top);
        if (@available(iOS 11.0, *)) {
            offset = CGPointMake(-self.adjustedContentInset.left, -self.adjustedContentInset.top);
        }
        if (CGPointEqualToPoint(self.contentOffset, offset) == NO) {
            self.contentOffset = offset;
        }
    }
}

- (CGSize)intrinsicContentSize
{
    if (self.attributedText.length == 0) {
        return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
    }
    
    CGRect rect = [self.attributedText boundingRectWithSize:CGSizeMake(self.bounds.size.width - [self widthPadding], CGFLOAT_MAX)
                                                    options:NSStringDrawingUsesLineFragmentOrigin
                                                    context:nil];
    
    return CGSizeMake(ceil(rect.size.width + [self widthPadding]),
                      ceil(rect.size.height + [self heightPadding]));
}

0

ভিটামিন ওয়াটারের উত্তর আমার পক্ষে কাজ করছে।

যদি আপনার পাঠ্যদর্শনটির পাঠ্যটি সম্পাদনার সময়, সেটিংয়ের পরে [textView setScrollEnabled:NO];সেট আপ করুন Size Inspector > Scroll View > Content Insets > Never

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


0

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


-1

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

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

সমাধান: ওভাররাইড সেটবাউন্ডগুলি: আপনার সাবক্লাসে। কোনও অজানা কারণে, পেস্টিংয়ের ফলে বাউন্ডস.রিগিন.ইয়ের মানটি জি-নন-এ পরিণত হয়েছিল (প্রতিটি ক্ষেত্রে আমি দেখেছি 33৩)। সুতরাং আমি সেটবাউন্ডারগুলিকে ওভাররড করেছি: সর্বদা সীমানা.রিগিন.ইয়কে শূন্যে সেট করতে। সমস্যা স্থির।


-1

এখানে একটি দ্রুত সমাধান:

যদি আপনি ক্লিপটোবাউন্ডস সম্পত্তিটি আপনার পাঠ্যদর্শনটির মিথ্যাতে সেট করে থাকেন তবে এই সমস্যা দেখা দিতে পারে। আপনি যদি কেবল এটি মুছে ফেলেন, সমস্যাটি চলে যায়।

myTextView.clipsToBounds = false //delete this line

-3
Obj C:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic) UITextView *textView;
@end



#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize textView;

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor grayColor]];
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(30,10,250,20)];
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}

- (void)textViewDidChange:(UITextView *)txtView{
    float height = txtView.contentSize.height;
    [UITextView beginAnimations:nil context:nil];
    [UITextView setAnimationDuration:0.5];

    CGRect frame = txtView.frame;
    frame.size.height = height + 10.0; //Give it some padding
    txtView.frame = frame;
    [UITextView commitAnimations];
}

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