আইওএস: অটো লেআউটে মাল্টি-লাইন ইউআইএলবেল


183

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

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

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

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

আমি কীভাবে এটি ঘটতে পারি?


3
আমিও একই রকম সমস্যা নিয়ে লড়াই করছি। তবে আমি এখনও সামগ্রীর সাথে মানানসইভাবে শীর্ষের লেবেলটির উচ্চতা গতিশীলভাবে সামঞ্জস্য করতে লড়াই করছি। আপনি কীভাবে এটি অর্জন করেছেন?
jbandi

1
@ MWuss এর উত্তরকে স্বীকৃত উত্তর হিসাবে চিহ্নিত করতে দয়া করে বিবেচনা করুন।
jemmons

1
আপনি প্রয়োজনীয় ফলাফল অর্জন করেছেন?
অনিরুদ্ধ

এটি পরীক্ষা করে দেখুন, আপনাকে কোডের একক লাইন stackoverflow.com/a/36862795/4910767
বাদল শাহ

উত্তর:


254

অটোলেআউট ব্যবহার -setPreferredMaxLayoutWidthকরুন UILabelএবং বাকীটি পরিচালনা করতে হবে।

[label setPreferredMaxLayoutWidth:200.0];

পছন্দসইম্যাক্স লেআউটউইথটিতে ইউআইএলবেল ডকুমেন্টেশন দেখুন ।

হালনাগাদ:

কেবল heightস্টোরিবোর্ডে এই সীমাবদ্ধতা সেট করতে হবে Greater than or equal to, প্রিফার্ডার্ডম্যাক্স লেআউটউইথকে সেট করার দরকার নেই।


8
ভাল এক, যাইহোক যাইহোক ইন্টারফেস বিল্ডারে এটি করতে?
সোজর্দ পারফার্স


10
অনুস্মারক: দয়া করে নম্বর অফলাইন সম্পত্তি সেট করতে মনে রাখবেন।
লি ফুমিন

2
হ্যাঁ, আপনি সর্বোচ্চ প্রস্থ যা চান তা ব্যবহার করুন।
mWhus

4
দেখুন stackoverflow.com/a/29180323/1529675 কিভাবে নির্ধারণ করার জন্য preferredMaxLayoutWidthকর এবং দেখ devetc.org/code/2014/07/07/auto-layout-and-views-that-wrap.html একটি সংক্ষিপ্ত কিন্তু তথ্যপূর্ণ লেখার জন্য, সঙ্গে সম্পূর্ণ অ্যানিমেটেড জিআইএফ (আমার লিখনআপ নয়, আমি এটি গুগলের মাধ্যমে পেয়েছি)
tboyce12

213

আপনার লেবেল সেট লাইনগুলির সংখ্যা 0 তে প্রসারিত করুন এবং আরও গুরুত্বপূর্ণভাবে অটো লেআউট সেট উচ্চতার জন্য> = x করুন। বাকীটি অটো লেআউট করবে। আপনি পূর্ববর্তী উপাদানের উপর ভিত্তি করে সঠিকভাবে অবস্থানের জন্য আপনার অন্যান্য উপাদানগুলিও ধারণ করতে পারেন।

স্বয়ংক্রিয় বিন্যাস


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

1
টেবিল ভিউ সেলের মধ্যে এটিই আমার জন্য একমাত্র উত্তর। এছাড়াও নির্ধারিত সংখ্যক সারি (0 / আনলিমিটেডের পরিবর্তে) নিয়ে কাজ করে
বগলসন

এটি আমার পক্ষে সুস্পষ্ট পছন্দের সর্বাধিক প্রস্থের সেট সহ কাজ করে না তাই এই প্রযুক্তিটি ব্যবহার করার সময় নিশ্চিত হয়ে নিন যে এটি আইবিতে স্বয়ংক্রিয়ভাবে সেট করা আছে। চিয়ার্স
জেএমসি

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

1
এটি আমার পক্ষে কাজ করে না। আমি বিশ্বাস করি স্ট্যাকওভারফ্লো.com/a/13032251/1529675 সঠিক উত্তর।
tboyce12

48

সূত্র: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

মাল্টি-লাইন পাঠ্যের অন্তর্নিহিত সামগ্রীর আকার

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

যেহেতু আমরা সাধারণত এই মানটি আগে থেকে জানি না, তাই এই অধিকার পেতে আমাদের একটি দ্বি-পদক্ষেপ গ্রহণ করা দরকার। প্রথমে আমরা অটো লেআউটটিকে তার কাজটি করতে দিয়েছি এবং তারপরে আমরা পছন্দসই সর্বাধিক প্রস্থ এবং ট্রিগার লেআউটটিকে আবার আপডেট করতে লেআউট পাসে ফলাফলযুক্ত ফ্রেমটি ব্যবহার করি।

- (void)layoutSubviews
{
    [super layoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [super layoutSubviews];
}

[সুপার লেআউটসুভিউ] প্রথম কলটি লেবেলের ফ্রেম সেট পেতে প্রয়োজনীয়, যখন দ্বিতীয় কলটি পরিবর্তনের পরে লেআউটটি আপডেট করার জন্য প্রয়োজনীয়। আমরা যদি দ্বিতীয় কলটি বাদ দিই তবে আমরা একটি এনএসআইটার্নাল ইনকনসিসিটিসিএক্সেপশন ত্রুটি পেয়েছি, কারণ আমরা সীমাবদ্ধতাগুলি আপডেট করার জন্য লেআউট পাসে পরিবর্তন করেছি, তবে আমরা আবার লেআউটটি ট্রিগার করি নি।

আমরা নিজেও একটি লেবেল সাবক্লাসে এটি করতে পারি:

@implementation MyLabel
- (void)layoutSubviews
{
    self.preferredMaxLayoutWidth = self.frame.size.width;
    [super layoutSubviews];
}
@end

এই ক্ষেত্রে, আমাদের প্রথমে [সুপার লেআউটসুভিউগুলি] কল করার দরকার নেই, কারণ যখন লেআউটসুভিউগুলি বলা হয়, তখন ইতিমধ্যে আমাদের নিজের লেবেলে একটি ফ্রেম থাকে।

ভিউ কন্ট্রোলার স্তর থেকে এই সমন্বয় করতে, আমরা ভিউডিডলআউটসুবউভিউগুলিতে .ুকি। এই মুহুর্তে প্রথম অটো লেআউট পাসের ফ্রেমগুলি ইতিমধ্যে সেট করা আছে এবং আমরা সেগুলি পছন্দের সর্বাধিক প্রস্থ সেট করতে ব্যবহার করতে পারি।

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [self.view layoutIfNeeded];
}

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


আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ কেবল কোডটিই নয়, তবে আরও গুরুত্বপূর্ণভাবে ব্যাখ্যা এবং কীভাবে এটি কেবল একটি সাবক্লাসে করা যায় না তার উদাহরণগুলি দেখুন, তবে ভিউ কন্ট্রোলার থেকেও।
জিবুতি 33

আমি এটি আমার ভিউ কন্ট্রোলারে চেষ্টা করছি, এবং ভিডলিআলআউটসউভভিউগুলি ভিউ উইল অ্যাপয়ার এবং ভিউডিডঅয়ারের পরে ডাকা হচ্ছে। ভিউডিড অ্যাপের পরে, যখন লেবেলগুলি সঠিকভাবে পুনরায় আকার দেওয়া হয় তখন একটি ফ্ল্যাশ থাকে। এটি এড়াতে কোন উপায় আছে? ব্যবহারকারীর কিছু দেখার আগেই কি আকার পরিবর্তন করার সম্পূর্ণ উপায় আছে? আমার ক্ষেত্রে, আমার বহু-লাইন লেবেল একটি tableHeaderView হয়, এবং তাই আমি এই উদাহরণ (ব্যবহার লেবেল উপর ভিত্তি করে হেডার দৃশ্য উচ্চতা মাপ করছি stackoverflow.com/questions/20982558/... )
djibouti33

@ জিবুতি ৩৩ আপনি কি দয়া করে ন্যূনতম নমুনা কোডটি সরবরাহ করতে পারেন (উদাহরণস্বরূপ গিথুব রেপো আকারে) যাতে আমি আপনার সমস্যাটি সহজেই পরীক্ষা করতে পারি?
আন্তন মাতোসভ

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

আমার জন্য একটি সমস্যা যেহেতু আমি আইওএস 9 সিমটিতে চালানো শুরু করেছি তবে আমি যখন আইওএস 8-তে পরীক্ষা করেছি তখন সমস্যা শুরু হয়েছিল। আমাকে নিজেই সর্বোচ্চ প্রস্থ নির্ধারণ করতে হবে।
নাজ

17

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

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

এটি কেস কিনা তা বলার একটি সহজ উপায় হ'ল লেবেলটিকে ম্যানুয়ালি আকার দেওয়ার চেষ্টা করা। আইবি কি আপনাকে এটি বাড়তে দেয়? যদি এটি হয় তবে নীচের লেবেলগুলি যেমন আপনি প্রত্যাশা করেন তেমন কি সরানো হয়? আপনার সীমাবদ্ধতা কীভাবে আপনার দৃষ্টিভঙ্গি সরিয়ে নেবে তা দেখার জন্য পুনরায় আকার দেওয়ার আগে আপনার উভয়টি পরীক্ষা করে দেখুন:

আইবি মেনু

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


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

5

আমি আপনার নিম্নলিখিত প্রয়োজন:

  • একটি শীর্ষ বাধা
  • একটি নেতৃস্থানীয় প্রতিবন্ধকতা (যেমন বাম দিক)
  • একটি পিছনে সীমাবদ্ধতা (যেমন ডান দিক)
  • বিষয়বস্তু আলিঙ্গন অগ্রাধিকার সেট করুন, অনুভূমিককে কম থেকে কম করুন, সুতরাং পাঠ্য সংক্ষিপ্ত থাকলে এটি প্রদত্ত স্থানটি পূরণ করবে।
  • কন্টেন্ট সংক্ষেপণ প্রতিরোধ সেট করুন, অনুভূমিককে কম থেকে কম করুন, সুতরাং এটি আরও প্রশস্ত হওয়ার চেষ্টা করার পরিবর্তে মোড়ানো হবে।
  • লাইনের সংখ্যা 0 তে সেট করুন।
  • লাইন ব্রেক বিরতি মোডকে শব্দের মোড়কে সেট করুন।

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

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

0

বিষয়টিতে বিভিন্ন বিষয়ে প্রাপ্ত ভিন্ন সমাধানগুলির কোনওটিই আমার ক্ষেত্রে পুরোপুরি কার্যকর হয়নি (গতিশীল টেবিল ভিউ সেলগুলিতে এক্স ডায়নামিক মাল্টলাইন লেবেল)।

আমি এটি করার একটি উপায় পেয়েছি:

আপনার লেবেলে সীমাবদ্ধতা স্থাপন করে এবং এর মাল্টিলাইন সম্পত্তি 0 তে সেট করার পরে, ইউআইএলবেলের একটি সাবক্লাস করুন; আমি আমার অটলআউটআউটবেলকে ফোন করেছি:

@implementation AutoLayoutLabel

- (void)layoutSubviews{
    [self setNeedsUpdateConstraints];
    [super layoutSubviews];
    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);
}

@end

0

আমার একটি ইউআইটিএবলভিউসেল রয়েছে যার একটি পাঠ্য মোড়ানো লেবেল রয়েছে। আমি নীচে পাঠ্য মোড়ানো কাজ।

1) নিম্নলিখিত হিসাবে UILabel সীমাবদ্ধতা সেট করুন।

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

2) সেট নম্বর। 0 লাইন।

3) ইউআইটিবেলউইচেলতে ইউআইএলবেল উচ্চতার সীমাবদ্ধতা যুক্ত করা হয়েছে।

@IBOutlet weak var priorityLabelWidth: NSLayoutConstraint!

4) ইউআইটিএবল ভিউসেল এ:

priorityLabel.sizeToFit()
priorityLabelWidth.constant = priorityLabel.intrinsicContentSize().width+5

-12

এটি করার একটি উপায় ... পাঠ্যের দৈর্ঘ্য বাড়ার সাথে সাথে লেবেলের পাঠ্যের ফন্টসাইজ ব্যবহার করে পরিবর্তন (হ্রাস) করার চেষ্টা করুন

Label.adjustsFontSizeToFitWidth = YES;

1
আমি দেখতে চাই নিয়ামকের বিভিন্ন দৃষ্টান্তের একটি সামঞ্জস্যপূর্ণ উপস্থিতি থাকুক, তাই আমি ফন্টের আকার পরিবর্তন করতে চাই না।
জেমস হার্পে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.