সমানভাবে এক ধারক দৃশ্যের মধ্যে একাধিক ভিউ রাখুন


279

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

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

এখানে তিনটি লেবেল রয়েছে (ম্যানুয়ালি উল্লম্বভাবে এমনকি ফাঁক করা):

image1

আমি যা চাই তা হ'ল আমি যখন ঘোরাম তখন সমানভাবে তাদের ব্যবধানের (দর্শন আকারের নয়) আকার পরিবর্তন করুক। ডিফল্টরূপে, শীর্ষ এবং নীচের দর্শনগুলি কেন্দ্রের দিকে স্কোয়াশ করে:

image2


হতে পারে একটি লেবেল থেকে অন্য লেবেলে সীমাবদ্ধতা সেট করুন এবং তাদের "আরও ভাল বা সমান" সম্পর্ক স্থাপন করুন সহায়ক হবে
বার্গপি

প্রোগ্রামগতভাবে উদাহরণস্বরূপ এনএসএলআউটকন্ট্রেন্টের এই পদ্ধতিটি ব্যবহার করে: + (আইডি) সীমাবদ্ধতাবিহীন আইটেম: (আইডি) ভিউ 1 বৈশিষ্ট্য: (এনএসএলআউটআউট্রিবিউট) অ্যাট্রি 1 সম্পর্কিতবাই: (এনএসএলআউটআলিটেশন) সম্পর্কিত আইটেম: (আইডি) ভিউ 2 বৈশিষ্ট্য: (এনএসএলআউটআউট্রিবিউট) গুণক গুণক ধ্রুবক: (সিজিফ্লোট) সি
বার্গপি

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

উত্তর:


211

সুতরাং আমার পদ্ধতির আপনাকে ইন্টারফেস বিল্ডারে এটি করার অনুমতি দেয়। আপনি যা করেন তা হল 'স্পেসার ভিউ' তৈরি করা যা আপনি সমানভাবে উচ্চতার সাথে মেলে। তারপরে লেবেলে শীর্ষ এবং নীচের সীমাবদ্ধতা যুক্ত করুন (স্ক্রিনশটটি দেখুন)।

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

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

দ্রষ্টব্য: আপনার লেবেলগুলিতে তদারকি করার জন্য অতিরিক্ত শীর্ষ / নীচের জায়গার সীমাবদ্ধতা থাকবে না তা নিশ্চিত হন; কেবল 'স্পেস ভিউ'-এ। এটি সন্তুষ্ট হবে যেহেতু শীর্ষ এবং নীচের সীমাবদ্ধতা যথাক্রমে 'স্পেস ভিউ 1' এবং 'স্পেসার ভিউ 4' এ রয়েছে।

দুহ 1: আমি আমার দৃষ্টিভঙ্গিটিকে নকল করেছি এবং কেবল এটিকে ল্যান্ডস্কেপ মোডে রেখেছি যাতে আপনি দেখতে পান যে এটি কাজ করে।

দুহ 2: 'স্পেসার দর্শনগুলি' স্বচ্ছ হতে পারত।

দুহ 3: এই পদ্ধতির অনুভূমিকভাবে প্রয়োগ করা যেতে পারে।


10
এইটা কাজ করে. আসলে স্পেসার দর্শনগুলি গোপন করা যেতে পারে এবং তারা এখনও সঠিক বিন্যাস তৈরি করতে পারে ।
পৌলমনিকো

এটি অত্যন্ত সহায়ক ছিল। যেমনটি কেবল স্পেসার ভিউগুলি লুকানো হিসাবে চিহ্নিত করার বিষয়ে মন্তব্য ছিল। তারপরে আপনি এগুলিকে আপনার স্টোরিবোর্ড / এক্সিবায় দেখতে পাচ্ছেন তবে তারা আপনার অ্যাপে প্রদর্শিত হবে না। খুব সুন্দর.
শুলমে

কয়েক ঘন্টা চেষ্টা করার পরেও আমি এটি প্রায় কাজ করতে পেরেছি । দুর্ভাগ্যক্রমে Xcode আমার শীর্ষ-স্থান-থেকে-বোতাম এবং নীচে-স্থানের সীমাবদ্ধতাগুলি মুছে ফেলে, বোতাম এবং স্পেসারগুলির মধ্যে শৃঙ্খলা ভেঙে দেয় এবং অকার্যকর স্থানের থেকে নির্ধারিত পর্যবেক্ষণ সীমাবদ্ধতার সাথে তাদের প্রতিস্থাপন করে।
Desty

একই পদ্ধতির অনুভূমিক বিন্যাসে আমার জন্য কাজ করে - আমার সমান প্রস্থ স্পেসার দর্শন দ্বারা পৃথক প্রস্থের মতামত পৃথক করা হয়েছে। এটি দুর্দান্ত যে আমার কোনও কোডের সাথে এটি মিশ্রিত করার দরকার নেই। ধন্যবাদ!
কামিল নামটেক.কম

2
স্পেসার ব্যবহার করার দরকার নেই। আমার উত্তর নীচে দেখুন।
হাসিবোট

316

দেখুন, কোনও স্পেসার নেই!

আমার মূল উত্তরের মন্তব্য বিভাগে দেওয়া পরামর্শগুলির উপর ভিত্তি করে, বিশেষত @ রিভেরার সহায়ক পরামর্শগুলি, আমি আমার মূল উত্তরটি সরল করে দিয়েছি।

আমি ঠিক কতটা সহজ এটি চিত্রিত করতে জিআইএফ ব্যবহার করছি। আমি আশা করি আপনি gifs সহায়ক বলে মনে করি। আপনার যদি জিআইএফএস নিয়ে সমস্যা হয় তবে আমি নীচের পুরানো উত্তরটি প্লেইন শটগুলির সাথে অন্তর্ভুক্ত করেছি।

নির্দেশাবলী:

1) আপনার বোতাম বা লেবেল যুক্ত করুন। আমি 3 টি বোতাম ব্যবহার করছি।

2) তদারকিতে প্রতিটি বোতাম থেকে কেন্দ্রের সীমাবদ্ধতা যুক্ত করুন:

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

3) প্রতিটি বোতাম থেকে নীচের বিন্যাসের সীমাবদ্ধতায় একটি সীমাবদ্ধতা যুক্ত করুন:

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

4) উপরে # 3 তে যুক্ত হওয়া সীমাবদ্ধতাটি নীচের মতো সামঞ্জস্য করুন:

ক) সীমাবদ্ধতাটি নির্বাচন করুন, খ) ধ্রুবকটি সরিয়ে ফেলুন (০ এ সেট করুন), গ) নিম্নরূপে গুণক পরিবর্তন করুন: বোতামের সংখ্যা নিন + 1 এবং শীর্ষে শুরু করে গুণকটি বাটনকাউন্টপ্লাস 1: 1 হিসাবে সেট করুন এবং তারপরে বাটনকাউন্টপ্লাস 1 : 2 , এবং অবশেষে বোতামকাউন্টপ্লাস 1: 3 । (আমি আগ্রহী হলে নীচের পুরানো উত্তরে আমি এই সূত্রটি কোথা থেকে পেয়েছি তা ব্যাখ্যা করি)।

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

5) এখানে একটি ডেমো চলছে!

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

দ্রষ্টব্য: যদি আপনার বোতামগুলির উচ্চতা আরও বেশি হয় তবে আপনাকে বাধাটি বোতামের নীচের দিক থেকে ধ্রুবক মান হিসাবে ক্ষতিপূরণ করতে হবে।


পুরানো উত্তর


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

প্রশ্নের উদাহরণে, আপনি চাইবেন would

1) প্রতিটি লেবেলকে কেন্দ্রের সীমাবদ্ধতার জন্য সেট করে শুরু করুন। এটি করা খুব সহজ। প্রতিটি লেবেল থেকে নীচে টানুন কেবল নিয়ন্ত্রণ করুন।

২) শিফটটি ধরে রাখুন, যেহেতু আপনি যে অন্য প্রতিবন্ধকতাগুলি আমরা ব্যবহার করতে যাচ্ছি তা যুক্ত করতে পারেন, যথা, "নীচের স্থানটি নীচের দিকের দিকনির্দেশ গাইড"।

3) "নীচের স্থান থেকে নীচে লেআউট গাইড" নির্বাচন করুন, এবং "পাত্রে অনুভূমিকভাবে কেন্দ্র"। সমস্ত 3 টি লেবেলের জন্য এটি করুন।

প্রতিটি লেবেলের জন্য এই দুটি সীমাবদ্ধতা যুক্ত করতে শিফট চেপে ধরে রাখুন

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

এখানে আমাদের গুণক রয়েছে।

লেবেল 1 = 1/4 = .25,

লেবেল 2 = 2/4 = .5,

লেবেল 3 = 3/4 = .75

(সম্পাদনা করুন: @ রিভেরা মন্তব্য করেছেন যে আপনি কেবলমাত্র গুণক ক্ষেত্রের অনুপাতটি সরাসরি ব্যবহার করতে পারেন, এবং গণিতের সাথে এক্সকোড!)

4) সুতরাং, আসুন লেবেল 1 নির্বাচন করুন এবং নীচের সীমাবদ্ধতা নির্বাচন করুন। এটার মত: এখানে চিত্র বর্ণনা লিখুন

5) বৈশিষ্ট্য পরিদর্শক মধ্যে "দ্বিতীয় আইটেম" নির্বাচন করুন।

)) ড্রপ ডাউন থেকে "বিপরীত প্রথম এবং দ্বিতীয় আইটেম" নির্বাচন করুন।

)) ধ্রুবক এবং ডাব্লুসি'র কোনও মানই জিরো। (আপনার যদি প্রয়োজন হয় তবে আপনি এখানে অফসেট যুক্ত করতে পারেন)।

8) এটি সমালোচনামূলক অংশ: গুণক ক্ষেত্রে আমাদের প্রথম গুণক 0.25 যোগ করুন।

9) আপনি যখন এটির উপরে রয়েছেন তখন শীর্ষস্থানীয় "প্রথম আইটেম "টিকে" CenterY "তে সেট করুন যেহেতু আমরা এটিকে লেবেলের ওয়াই কেন্দ্রে কেন্দ্র করে রাখতে চাই। এখানে সমস্ত কিছু দেখতে হবে।

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

10) প্রতিটি লেবেলের জন্য এই প্রক্রিয়াটি পুনরাবৃত্তি করুন এবং সংশ্লিষ্ট গুণকটিতে প্লাগ করুন: লেবেল 2 এর জন্য 0.5 এবং লেবেল 3 এর জন্য 0.75। সমস্ত কমপ্যাক্ট ডিভাইসগুলির সাথে সমস্ত ওরিয়েন্টেশনে চূড়ান্ত পণ্যটি এখানে! সুপার সিম্পল আমি কোডগুলি এবং স্পেসারগুলির পুনরায় জড়িত অনেকগুলি সমাধানের দিকে তাকিয়ে আছি। এটি ইস্যুতে আমি দেখেছি সর্বোত্তম সমাধান and

আপডেট: @ ক্রাফটিদেবিল যোগ করেছেন যে নীচের লেআউট গাইডটি কেবল স্টোবোর্ডগুলিতে প্রদর্শিত হবে, xibs এ নয়। এক্সবিজে 'কন্টেনার থেকে নীচে স্থান' ব্যবহার করুন। ভালো বল ধরা!

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


2
আমি এখনও এটি নিয়ে সংগ্রাম করছি। আমি মনে করি আপনি অবশ্যই Xcode 6 ব্যবহার করবেন কারণ Xcode 5 সীমাবদ্ধতায় কোনও 'wC hAny' বিকল্প নেই। আমি যখন আপনার নির্দেশাবলী অনুসরণ করি, তখন সমস্ত সংক্ষিপ্তসারগুলি উপরের কেন্দ্রে আটকে যায়।
ক্রাফটিদেভিল

4
@ ক্রাফটিদেবিল এএফাইক নীচের লেআউট গাইডটি কেবল স্টোবোর্ডগুলিতে প্রদর্শিত হবে, এক্সবিগুলিতে নয়। এক্সবিজে 'কন্টেনার থেকে নীচে স্থান' ব্যবহার করুন।
তৈমুর কুচকারভ

6
ওহ - এটিও লক্ষণীয় যে
এক্সকোড in-এ আইবি অনুপাতের গুণককে

3
বাম দিক থেকে প্রথম টেক্সটভিউ ১/৩ এর মতো এবং দ্বিতীয় পাঠ্য ভিউ ২ / ৩ (বাকি অংশ) - এর মতো অনুভূমিকভাবে কীভাবে এটি করবেন তা বোঝার চেষ্টা করছেন ... ... (সম্পাদনা) এটি পেয়েছে - কর প্রথম 1/3 (এক বাম) ট্রেলিং-স্পেস থেকে ডান মার্জিন, বিপরীত, শূন্য, আগের মতো নির্ধারণ করুন ...
kfmfe04

3
অনুভূমিক ব্যবধানের জন্য, প্রতিটি পর্যালোচনার জন্য সুপারভিউতে কেবল অনুসরণের সীমাবদ্ধতাগুলি সেট করুন এবং তারপরে অনুপাতের গুণক নির্ধারণ করুন। 5: 1, 5: 2, 5: 3, ইত্যাদি বাম থেকে ডানে অগ্রসর হয়।
user3344977

98

খুব দ্রুত ইন্টারফেস বিল্ডার সমাধান:

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

কোথায়

N = total number of views, এবং

p = position of the view including spaces

প্রথম অবস্থান 1, তারপরে একটি স্থান, পরবর্তী অবস্থান 3 তৈরি করে, তাই পি সিরিজ হয়ে যায় [1,3,5,7,9, ...]। যে কোনও সংখ্যা দেখার জন্য কাজ করে।

সুতরাং, স্পেস আউট করার জন্য যদি আপনার কাছে 3 টি ভিউ থাকে, তবে এটির মতো দেখাচ্ছে:

আইবিতে সমানভাবে মতামত কীভাবে ছড়িয়ে দেওয়া যায় তার উদাহরণ

সম্পাদনা নোট: পছন্দ N:pবা p:Nআপনার প্রান্তিককরণের সীমাবদ্ধতার সম্পর্কের উপর নির্ভর করে। যদি "প্রথম আইটেম" Superview.Center হয়, তাহলে আপনি ব্যবহার করতে পারেন p:N, যখন যদি Superview.Center "দ্বিতীয়ত আইটেম" হয়, তাহলে আপনি ব্যবহার করতে পারেন N:p। যদি সন্দেহ হয়, তবে উভয়ই চেষ্টা করে দেখুন ... :-)


আপনি যদি অন্য কোনও ভাষাতে স্যুইচ করেন তবে এই সমাধানটি নকশাকে প্রতিফলিত করবে না
wod

@ ভোড আপনার মানে কি? অন্য ভাষায় কি স্যুইচ করবেন? এবং ঠিক কি বিরতি?
মেটা

4
যদি উপাদানগুলি একই আকার না হয় তবে কী হবে? এই প্যাটার্নটি সঠিকভাবে কাজ করবে না?
uketgetit

2
আমি বুঝতে পারি না এই সমাধানটি কীভাবে সঠিক? পর্দার প্রান্ত এবং বাইরের উপাদানগুলির মধ্যবর্তী ব্যবধান বাইরের উপাদান এবং কেন্দ্রের উপাদানগুলির মধ্যে ব্যবধানের চেয়ে আলাদা?
myles

6
এটি আমার পক্ষে হয়নি "যেমনটি" আমাকে গুণকগুলি বিপরীত করতে হয়েছিল (প্রথম আইটেমটি থেকে 3: 1 কে 1: 3 এ রূপান্তরিত করে)। এটি যদি কাউকে সহায়তা করে তবে এটি কেবল সেখানে ফেলে দেওয়া হচ্ছে।
Ces

70

আইওএস 9 হিসাবে, অ্যাপলটি (দীর্ঘ প্রতীক্ষিত) দিয়ে এটিকে খুব সহজ করে তুলেছে UIStackView। ইন্টারফেস বিল্ডারে আপনি যে মতামতগুলি ধারণ করতে চান তা কেবল নির্বাচন করুন এবং সম্পাদক -> এম্বেড ইন -> স্ট্যাক ভিউ চয়ন করুন। স্ট্যাক ভিউয়ের জন্য উপযুক্ত প্রস্থ / উচ্চতা / মার্জিন সীমাবদ্ধতাগুলি সেট করুন এবং বিতরণ সম্পত্তিটিকে 'সমান ব্যবধানে' সেট করতে নিশ্চিত করুন:

অবশ্যই, আপনার যদি আইওএস 8 বা তার চেয়ে কম সমর্থন করতে হয় তবে আপনাকে অন্য বিকল্পগুলির মধ্যে একটি বেছে নিতে হবে।


হ্যাঁ, এটি দুঃখজনক যে এতে রেট্রো সামঞ্জস্যতা নেই, সুতরাং আপনার অ্যাপ্লিকেশনটির আইওএস 8 এর জন্য সমর্থন প্রয়োজন না হওয়া পর্যন্ত @ মেট প্রতিক্রিয়া আপাতত সেরা।
ZiggyST

51

আমি অটলেআউটকে ভালবাসি এবং ঘৃণা করি co এটি প্রেম করার মূল চাবিকাঠিটি নিম্নলিখিতটি গ্রহণ করা বলে মনে হচ্ছে:

  1. ইন্টারফেস বিল্ডারের সম্পাদনা এবং সীমাবদ্ধতার "সহায়ক" স্বতঃ-তৈরি করা সবচেয়ে তুচ্ছ ঘটনা বাদে সকলের কাছেই অকেজো is
  2. কোডটি তাই পুনরাবৃত্তিযোগ্য এবং ভার্ভোজ হওয়ায় সাধারণ ক্রিয়াকলাপকে সহজ করার জন্য বিভাগগুলি তৈরি করা একটি জীবন রক্ষাকারী।

এটি বলেছিল, আপনি যা চেষ্টা করছেন তা সোজা নয় এবং ইন্টারফেস বিল্ডারে অর্জন করা কঠিন হবে। কোড করতে এটি বেশ সহজ। এই viewDidLoadকোডটিতে, তিনটি লেবেল আপনি কীভাবে জিজ্ঞাসা করছেন তা তৈরি এবং অবস্থান নির্ধারণ করে:

// Create three labels, turning off the default constraints applied to views created in code
UILabel *label1 = [UILabel new];
label1.translatesAutoresizingMaskIntoConstraints = NO;
label1.text = @"Label 1";

UILabel *label2 = [UILabel new];
label2.translatesAutoresizingMaskIntoConstraints = NO;
label2.text = @"Label 2";

UILabel *label3 = [UILabel new];
label3.translatesAutoresizingMaskIntoConstraints = NO;
label3.text = @"Label 3";

// Add them all to the view
[self.view addSubview:label1];
[self.view addSubview:label2];
[self.view addSubview:label3];

// Center them all horizontally
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label3 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0]];

// Center the middle one vertically
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label2 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0]];

// Position the top one half way up
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:label2 attribute:NSLayoutAttributeCenterY multiplier:0.5 constant:0]];

// Position the bottom one half way down
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label3 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:label2 attribute:NSLayoutAttributeCenterY multiplier:1.5 constant:0]];

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

বিভাগটি এখানে আগ্রহীদের জন্য এখানে রয়েছে এবং এটি নির্দিষ্ট অক্ষের সাথে সমানভাবে দর্শনের অ্যারের ফাঁক করার জন্য একটি পদ্ধতি রয়েছে।


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

স্পষ্টতই খুব কাছাকাছি থাকার সময়, এটি জিজ্ঞাসা করা সঠিক সমস্যাটিকে পুরোপুরি সমাধান করে না (উপদর্শনগুলির মধ্যে এমনকি ব্যবধানের সাথে দর্শন আকারটি একই রাখছে)। এই সমাধানটি পরিমার্জিত সাধারণ মামলার উত্তর।
স্মাইলিবার্গ

21

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

তাদের তত্ত্বাবধানের মধ্যে উল্লম্বভাবে 4 টি লেবেল বিতরণের ব্যবহারের উদাহরণ:

[self.view addConstraints:
     [NSLayoutConstraint constraintsForEvenDistributionOfItems:@[label1, label2, label3, label4]
                                        relativeToCenterOfItem:self.view
                                                    vertically:YES]];

NSLayoutConstraint + + EvenDistribution.h

@interface NSLayoutConstraint (EvenDistribution)

/**
 * Returns constraints that will cause a set of views to be evenly distributed horizontally
 * or vertically relative to the center of another item. This is used to maintain an even
 * distribution of subviews even when the superview is resized.
 */
+ (NSArray *) constraintsForEvenDistributionOfItems:(NSArray *)views
                             relativeToCenterOfItem:(id)toView
                                         vertically:(BOOL)vertically;

@end

NSLayoutConstraint + + EvenDistribution.m

@implementation NSLayoutConstraint (EvenDistribution)

+(NSArray *)constraintsForEvenDistributionOfItems:(NSArray *)views
                           relativeToCenterOfItem:(id)toView vertically:(BOOL)vertically
{
    NSMutableArray *constraints = [NSMutableArray new];
    NSLayoutAttribute attr = vertically ? NSLayoutAttributeCenterY : NSLayoutAttributeCenterX;

    for (NSUInteger i = 0; i < [views count]; i++) {
        id view = views[i];
        CGFloat multiplier = (2*i + 2) / (CGFloat)([views count] + 1);
        NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view
                                                                      attribute:attr
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:toView
                                                                      attribute:attr
                                                                     multiplier:multiplier
                                                                       constant:0];
        [constraints addObject:constraint];
    }

    return constraints;
}

@end

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

@ কার্লোস_এমএস আমি আপনার কোডটি দেখতে পছন্দ করব, কারণ যখন আমি এমনকি প্রচুর আইটেমগুলির সাথে চেষ্টা করি তখন ডিভাইসের অরিয়েন্টেশনগুলি স্যুইচ করার সময় এই কোডটি পুরোপুরি কার্যকর হয়। আপনি কি নিশ্চিত যে অসাবধানতাবশত অন্য কিছু প্রতিবন্ধকতা নেই (যেমন স্বতঃসীমাবদ্ধতাগুলি) বিরোধ সৃষ্টি করছে?
বেন ডলম্যান

এখানে 4 টি লেবেল তৈরি করার এবং উল্লম্ব অক্ষ বরাবর এগুলি সমানভাবে ফাঁক করার একটি উদাহরণ রয়েছে: gist.github.com/bdolman/5379465
বেন ডলম্যান

20

সঠিক এবং সহজ উপায় হ'ল স্ট্যাক ভিউ ব্যবহার করা।

  1. স্ট্যাক ভিউতে আপনার লেবেল / দর্শন যুক্ত করুন :

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

  1. স্ট্যাক দর্শন এবং সেট নির্বাচন করুন বিতরণ করা সমান ব্যবধান :

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

  1. স্ট্যাক ভিউ এবং আপডেট করার ফ্রেমে নিকটস্থ প্রতিবেশী সীমাবদ্ধতায় ব্যবধান যোগ করুন :

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

  1. সমস্ত লেবেলে উচ্চতার সীমাবদ্ধতা যুক্ত করুন (alচ্ছিক)। কেবলমাত্র এমন দৃষ্টিভঙ্গিগুলির জন্য প্রয়োজন যা অন্তর্নিহিত আকারের নয়) উদাহরণস্বরূপ লেবেলগুলির এখানে উচ্চতার সীমাবদ্ধতার প্রয়োজন হয় না এবং উদাহরণস্বরূপ কেবলমাত্র অফলাইন = 3 বা 0 সেট করা দরকার।

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

  1. পূর্বরূপ উপভোগ করুন:

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


2
এটি কেবলমাত্র = = আইওএস 9.0 তাই আপনার প্রয়োগ শুরু করার আগে আপনার স্থাপনার লক্ষ্যমাত্রাটি পরীক্ষা করুন :) যদিও এতে যুক্ত হয়েছে এটি দুর্দান্ত!
DivideByZer0

1
2018 এখন, স্ট্যাক ভিউটি ব্যবহার করুন
জিংসওও চেন

17

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

থেকে NSArray + + PureLayout.h :

// NSArray+PureLayout.h

// ...

/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (variable) in the dimension along the axis and will have spacing (fixed) between them. */
- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis
                                alignedTo:(ALAttribute)alignment
                         withFixedSpacing:(CGFloat)spacing;

/** Distributes the views in this array equally along the selected axis in their superview. Views will be the same size (fixed) in the dimension along the axis and will have spacing (variable) between them. */
- (NSArray *)autoDistributeViewsAlongAxis:(ALAxis)axis
                                alignedTo:(ALAttribute)alignment
                            withFixedSize:(CGFloat)size;

// ...

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


চমৎকার কাজ! যদিও আপনার সম্ভবত রেপুর নামকরণ করা উচিত যাতে আপনি এটি কোকোপডের মাধ্যমে উপলব্ধ করতে পারেন।
jrturton

9

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

ব্যবধান চিত্র দেখুন

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

তবুও, আমি এখনও একটি ভাল জেনেরিক সমাধান নিয়ে আসিনি। বর্তমানে আমার সেরা ধারণাটি হ'ল সাবউভিউগুলির মধ্যে "স্পেসিং ভিউগুলি" সন্নিবেশ করা এবং স্পেসিং ভিউগুলির উচ্চতা সমান হওয়া সেট করা।


1
আমি লুকানো স্পেসার ভিউগুলির সমাধানটি ব্যবহার করেছি, যা ভালভাবে কাজ করে।
পৌলমনিকো

8

আমি পুরোপুরি আইবিতে এটি সমাধান করতে সক্ষম হয়েছি:

  1. আপনার প্রতিটি মতামতের কেন্দ্রের Y কে তত্ত্বাবধানের নীচের প্রান্তে প্রান্তিককরণ করার জন্য প্রতিবন্ধকতা তৈরি করুন।
  2. এই প্রতিবন্ধগুলির প্রতিটিটির গুণককে 1 / 2n, 3 / 2n, 5 / 2n,…, n-1 / 2n এ সেট করুন যেখানে n আপনি বিতরণ করছেন এমন সংক্ষিপ্তসার সংখ্যা।

সুতরাং আপনার যদি তিনটি লেবেল থাকে তবে এই প্রতিবন্ধগুলির প্রতিটিটির জন্য গুণমানগুলি 0.1666667, 0.5, 0.833333 এ সেট করুন।


1
আমি আসলে 1 / এন 3 / এন 5 / এন 7 / এন অবধি (2 এন -1) / এন করতে হয়েছিল
হামজা মালেক

5

আমি একটি নিখুঁত এবং সহজ পদ্ধতি খুঁজে পেয়েছি। স্বয়ংক্রিয় বিন্যাস আপনাকে স্পেসগুলি সমান আকারে পরিবর্তন করতে দেয় না, তবে এটি আপনাকে সমানভাবে মতামতের আকার পরিবর্তন করতে দেয়। কেবলমাত্র আপনার ক্ষেত্রগুলির মধ্যে কিছু অদৃশ্য দৃষ্টিভঙ্গি রাখুন এবং তাদের একই আকার রাখতে অটো লেআউটটিকে বলুন। এটি পুরোপুরি কাজ করে!

প্রাথমিক একাদশ

প্রসারিত একাদশ

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

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


4

বেন ডলম্যানের জবাবের ভিত্তিতে, এই মতামতগুলিকে আরও সমানভাবে বিতরণ করা হয়েছে (প্যাডিং ইত্যাদি সহ):

+(NSArray *)constraintsForEvenDistributionOfItems:(NSArray *)views
                           relativeToCenterOfItem:(id)toView vertically:(BOOL)vertically
{
    NSMutableArray *constraints = [NSMutableArray new];
    NSLayoutAttribute attr = vertically ? NSLayoutAttributeCenterY : NSLayoutAttributeCenterX;

    CGFloat min = 0.25;
    CGFloat max = 1.75;
    CGFloat d = (max-min) / ([views count] - 1);
    for (NSUInteger i = 0; i < [views count]; i++) {
        id view = views[i];
        CGFloat multiplier = i * d + min;
        NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view
                                                                      attribute:attr
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:toView
                                                                      attribute:attr
                                                                     multiplier:multiplier
                                                                       constant:0];
        [constraints addObject:constraint];
    }

    return constraints;
}

3

পরীক্ষা https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html আপনার সমস্যা সমাধানে সম্পর্কে চমৎকার বর্ণনা হচ্ছে।


1
আইওএস 9 প্রকাশের পরে ইউআইএসট্যাকভিউকে এই কাজটি করার জন্য সর্বোত্তম বিকল্প হিসাবে প্রকাশ করার পরে, অ্যাপল এই পৃষ্ঠাটি সরিয়ে নিয়েছে
মেহুল ঠাক্কার

3

লেবেল সহ এটি কমপক্ষে সূক্ষ্মভাবে কাজ করে:

@"H:|-15-[first(==second)]-[second(==third)]-[third(==first)]-15-|

যদি প্রথমটির দ্বিতীয়টির মতো একই প্রস্থ থাকে এবং দ্বিতীয়টি তৃতীয় এবং তৃতীয়টি প্রথম হয় তবে তারা সকলেই একই প্রস্থ পাবে ... আপনি এটি অনুভূমিকভাবে (এইচ) এবং উল্লম্বভাবে (ভি) উভয়ই করতে পারেন।


3

সুইফট 3 সংস্করণ

let _redView = UIView()
        _redView.backgroundColor = UIColor.red
        _redView.translatesAutoresizingMaskIntoConstraints = false

        let _yellowView = UIView()
        _yellowView.backgroundColor = UIColor.yellow
        _yellowView.translatesAutoresizingMaskIntoConstraints = false

        let _blueView = UIView()
        _blueView.backgroundColor = UIColor.blue
        _blueView.translatesAutoresizingMaskIntoConstraints = false

        self.view.addSubview(_redView)
        self.view.addSubview(_yellowView)
        self.view.addSubview(_blueView)

        var views = ["_redView": _redView, "_yellowView": _yellowView, "_blueView":_blueView]

        var nslayoutConstraint_H = NSLayoutConstraint.constraints(withVisualFormat: "|->=0-[_redView(40)]->=0-[_yellowView(40)]->=0-[_blueView(40)]->=0-|", options: [.alignAllTop, .alignAllBottom], metrics: nil, views: views)
        self.view.addConstraints(nslayoutConstraint_H)

        var nslayoutConstraint_V = NSLayoutConstraint.constraints(withVisualFormat: "V:[_redView(60)]", options: NSLayoutFormatOptions.init(rawValue: 0), metrics: nil, views: views)
        self.view.addConstraints(nslayoutConstraint_V)


        let constraint_red = NSLayoutConstraint.init(item: self.view, attribute: .centerY, relatedBy: .equal, toItem: _redView, attribute: .centerY, multiplier: 1, constant: 0)
        self.view.addConstraint(constraint_red)

        let constraint_yellow = NSLayoutConstraint.init(item: self.view, attribute: .centerX, relatedBy: .equal, toItem: _yellowView, attribute: .centerX, multiplier: 1, constant: 0)
        self.view.addConstraint(constraint_yellow)

        let constraint_yellow1 = NSLayoutConstraint.init(item: _redView, attribute: .centerX, relatedBy: .equal, toItem: _yellowView, attribute: .leading, multiplier: 0.5, constant: 0)
        self.view.addConstraint(constraint_yellow1)

        let constraint_yellow2 = NSLayoutConstraint.init(item: _blueView, attribute: .centerX, relatedBy: .equal, toItem: _yellowView, attribute: .leading, multiplier: 1.5, constant: 40)
        self.view.addConstraint(constraint_yellow2)

1
এই কোডটি কীভাবে প্রশ্নের উত্তর দেয় তা বিশদ দিয়ে ভবিষ্যতের দর্শকদের সহায়তা করবে।
জাল 28

2

আমি জানি প্রথম উত্তর হওয়ার পরে এটি বেশ কিছুক্ষণ হয়েছে, তবে আমি ঠিক একই সমস্যাটি পেয়েছি এবং আমি আমার সমাধানটি ভাগ করতে চাই। প্রজন্ম আগত ...

আমি ভিডডিলোডে আমার মতামত সেট করেছি:

- (void)viewDidLoad {

    [super viewDidLoad];

    cancelButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    cancelButton.translatesAutoresizingMaskIntoConstraints = NO;
    [cancelButton setTitle:@"Cancel" forState:UIControlStateNormal];
    [self.view addSubview:cancelButton];

    middleButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    middleButton.translatesAutoresizingMaskIntoConstraints = NO;
    [middleButton setTitle:@"Middle" forState:UIControlStateNormal];
    [self.view addSubview:middleButton];

    nextButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    nextButton.translatesAutoresizingMaskIntoConstraints = NO;
    [nextButton setTitle:@"Next" forState:UIControlStateNormal];
    [self.view addSubview:nextButton];


    [self.view setNeedsUpdateConstraints];

}

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

- (void)updateViewConstraints {


    [super updateViewConstraints];

    [self.view removeConstraints:self.view.constraints];

    NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(cancelButton, nextButton, middleButton);

    float distance=(self.view.bounds.size.width-cancelButton.intrinsicContentSize.width-nextButton.intrinsicContentSize.width-middleButton.intrinsicContentSize.width-20-20)/  ([viewsDictionary count]-1);  // 2 times 20 counts for the left & rigth margins
    NSNumber *distancies=[NSNumber numberWithFloat:distance];

//    NSLog(@"Distancies: %@", distancies);
//    
//    NSLog(@"View Width: %f", self.view.bounds.size.width);
//    NSLog(@"Cancel Width: %f", cancelButton.intrinsicContentSize.width);
//    NSLog(@"Middle Width: %f", middleButton.intrinsicContentSize.width);
//    NSLog(@"Next Width: %f", nextButton.intrinsicContentSize.width);



    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[cancelButton]-dis-[middleButton]-dis-[nextButton]-|"
                                                                   options:NSLayoutFormatAlignAllBaseline
                                                                   metrics:@{@"dis":distancies}
                                                                     views:viewsDictionary];


    [self.view addConstraints:constraints];



    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[nextButton]-|"
                                                          options:0
                                                          metrics:nil
                                                            views:viewsDictionary];
    [self.view addConstraints:constraints];



}

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

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


2

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

এই উদাহরণস্বরূপ, selfআপনি যে সমস্ত সুপারভিউকে কেন্দ্র করে দিচ্ছেন সেই সুপারভিউটি কি।

NSArray *subviews = @[ (your subviews in top-to-bottom order) ];

UIView *container = [[UIView alloc] initWithFrame:CGRectZero];
container.translatesAutoresizingMaskIntoConstraints = NO;
for (UIView *subview in subviews) {
    subview.translatesAutoresizingMaskIntoConstraints = NO;
    [container addSubview:subview];
}
[self addSubview:container];

[self addConstraint:[NSLayoutConstraint constraintWithItem:container attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual
                                                    toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0f constant:0.0f]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:container attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual
                                                    toItem:self attribute:NSLayoutAttributeRight multiplier:1.0f constant:0.0f]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:container attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual
                                                    toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]];

if (0 < subviews.count) {
    UIView *firstSubview = subviews[0];
    [container addConstraint:[NSLayoutConstraint constraintWithItem:firstSubview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual
                                                             toItem:container attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]];
    UIView *lastSubview = subviews.lastObject;
    [container addConstraint:[NSLayoutConstraint constraintWithItem:lastSubview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual
                                                             toItem:container attribute:NSLayoutAttributeBottom multiplier:1.0f constant:0.0f]];

    UIView *subviewAbove = nil;
    for (UIView *subview in subviews) {
        [container addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual
                                                                 toItem:container attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]];
        if (subviewAbove) {
            [container addConstraint:[NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual
                                                                     toItem:subviewAbove attribute:NSLayoutAttributeBottom multiplier:1.0f constant:10.0f]];
        }
        subviewAbove = subview;
    }
}

কেন্দ্রিক হওয়া আবশ্যক বিভিন্ন আকারের ভিউ ব্যবহার করার সময় এটি সেরা সমাধান।
noobsmcgoobs

2

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

আমি যা করে শেষ করেছি তা হ'ল:

1) প্রথমে 320px প্রস্থের স্ক্রিনে আমার বোতামগুলি স্থিত করে 320px ডিভাইসটি দেখতে চাইার উপায়টি বিতরণ করা হয়েছে।

পদক্ষেপ 1: বোতাম অবস্থিত করা

2) তারপরে আমি আমার সমস্ত বোতামে তত্ত্বাবধানে একটি শীর্ষস্থানীয় স্পেস সীমাবদ্ধতা যুক্ত করেছি।

পদক্ষেপ 2: শীর্ষস্থানীয় সীমাবদ্ধতা যুক্ত করুন

3) তারপরে আমি নেতৃস্থানীয় স্থানের বৈশিষ্ট্যগুলি সংশোধন করেছি যাতে ধ্রুবক 0 ছিল এবং গুণকটি পর্দার প্রস্থে বিভক্ত x অফসেট (যেমন আমার প্রথম বোতামটি বাম প্রান্ত থেকে 8px ছিল তাই আমি আমার গুণকটি 8/320 এ সেট করেছি)

৪) তারপরে এখানে গুরুত্বপূর্ণ পদক্ষেপটি সুপারভাইউ হওয়ার জন্য সীমাবদ্ধতার সম্পর্কের ক্ষেত্রে দ্বিতীয় আইটেমটি পরিবর্তন করা superv সুপারভিউ.ল্রেডিংয়ের পরিবর্তে ট্রেলিং। এটি কী, কারণ তত্ত্বাবধানটি রয়েছে L লিডিং 0 হয় এবং আমার ক্ষেত্রে 320 প্যাকেজ হয়, সুতরাং 8/320 320px ডিভাইসে 8 পিক্স হয়, তখন যখন সুপারভিউয়ের প্রস্থ 640 বা যে কোনও কিছুতে পরিবর্তিত হয়, তখন সমস্ত দৃশ্য প্রস্থের সাথে অনুপাতের সাথে চলে যায় 320px স্ক্রিন আকার। এখানে গণিতটি বোঝা অনেক সহজ।

পদক্ষেপ 3 এবং 4: এক্সপোস / স্ক্রিনউইথের সাথে গুণক পরিবর্তন করুন এবং দ্বিতীয় আইটেমটি সেট করুন ra


2

অনেক উত্তর সঠিক নয়, তবে অনেকগুলি গণনা পান। এখানে আমি কেবল সমাধান হিসাবে একটি প্রোগ্রাম লিখি, তিনটি দর্শন স্পেসার ভিউগুলি ব্যবহার না করে অনুভূমিক প্রান্তিককরণ , তবে স্টোরিবোর্ডে যখন লেবেলের প্রস্থগুলি ব্যবহৃত হয় তখন এটি কেবল তখনই কাজ করে

NSDictionary *views = NSDictionaryOfVariableBindings(_redView, _yellowView, _blueView);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|->=0-[_redView(40)]->=0-[_yellowView(40)]->=0-[_blueView(40)]->=0-|" options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:nil views:views]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_redView(60)]" options:0 metrics:nil views:views]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:_redView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:_yellowView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_redView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:_yellowView attribute:NSLayoutAttributeLeading multiplier:0.5 constant:0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_blueView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:_yellowView attribute:NSLayoutAttributeLeading multiplier:1.5 constant:40]];

2

এখানে আরও একটি উত্তর। আমি অনুরূপ প্রশ্নের উত্তর দিচ্ছিলাম এবং এই প্রশ্নের সাথে সম্পর্কিত লিঙ্কটি দেখেছি। আমার মতো কোনও উত্তর আমি দেখতে পাইনি। সুতরাং, আমি এটি এখানে লিখতে ভেবেছিলাম।

  class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.whiteColor()
        setupViews()
    }

    var constraints: [NSLayoutConstraint] = []

    func setupViews() {

        let container1 = createButtonContainer(withButtonTitle: "Button 1")
        let container2 = createButtonContainer(withButtonTitle: "Button 2")
        let container3 = createButtonContainer(withButtonTitle: "Button 3")
        let container4 = createButtonContainer(withButtonTitle: "Button 4")

        view.addSubview(container1)
        view.addSubview(container2)
        view.addSubview(container3)
        view.addSubview(container4)

        [

            // left right alignment
            container1.leftAnchor.constraintEqualToAnchor(view.leftAnchor, constant: 20),
            container1.rightAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -20),
            container2.leftAnchor.constraintEqualToAnchor(container1.leftAnchor),
            container2.rightAnchor.constraintEqualToAnchor(container1.rightAnchor),
            container3.leftAnchor.constraintEqualToAnchor(container1.leftAnchor),
            container3.rightAnchor.constraintEqualToAnchor(container1.rightAnchor),
            container4.leftAnchor.constraintEqualToAnchor(container1.leftAnchor),
            container4.rightAnchor.constraintEqualToAnchor(container1.rightAnchor),


            // place containers one after another vertically
            container1.topAnchor.constraintEqualToAnchor(view.topAnchor),
            container2.topAnchor.constraintEqualToAnchor(container1.bottomAnchor),
            container3.topAnchor.constraintEqualToAnchor(container2.bottomAnchor),
            container4.topAnchor.constraintEqualToAnchor(container3.bottomAnchor),
            container4.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor),


            // container height constraints
            container2.heightAnchor.constraintEqualToAnchor(container1.heightAnchor),
            container3.heightAnchor.constraintEqualToAnchor(container1.heightAnchor),
            container4.heightAnchor.constraintEqualToAnchor(container1.heightAnchor)
            ]
            .forEach { $0.active = true }
    }


    func createButtonContainer(withButtonTitle title: String) -> UIView {
        let view = UIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false

        let button = UIButton(type: .System)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle(title, forState: .Normal)
        view.addSubview(button)

        [button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor),
            button.leftAnchor.constraintEqualToAnchor(view.leftAnchor),
            button.rightAnchor.constraintEqualToAnchor(view.rightAnchor)].forEach { $0.active = true }

        return view
    }
}

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

এবং আবারও, এটি iOS9 ইউআইএসট্যাকভিউগুলির সাথেও খুব সহজেই করা যায়।

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.greenColor()
        setupViews()
    }

    var constraints: [NSLayoutConstraint] = []

    func setupViews() {

        let container1 = createButtonContainer(withButtonTitle: "Button 1")
        let container2 = createButtonContainer(withButtonTitle: "Button 2")
        let container3 = createButtonContainer(withButtonTitle: "Button 3")
        let container4 = createButtonContainer(withButtonTitle: "Button 4")

        let stackView = UIStackView(arrangedSubviews: [container1, container2, container3, container4])
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .Vertical
        stackView.distribution = .FillEqually
        view.addSubview(stackView)

        [stackView.topAnchor.constraintEqualToAnchor(view.topAnchor),
            stackView.bottomAnchor.constraintEqualToAnchor(view.bottomAnchor),
            stackView.leftAnchor.constraintEqualToAnchor(view.leftAnchor, constant: 20),
            stackView.rightAnchor.constraintEqualToAnchor(view.rightAnchor, constant: -20)].forEach { $0.active = true }
    }


    func createButtonContainer(withButtonTitle title: String) -> UIView {
        let button = UIButton(type: .Custom)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = UIColor.redColor()
        button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
        button.setTitle(title, forState: .Normal)
        let buttonContainer = UIStackView(arrangedSubviews: [button])
        buttonContainer.distribution = .EqualCentering
        buttonContainer.alignment = .Center
        buttonContainer.translatesAutoresizingMaskIntoConstraints = false
        return buttonContainer
    }
}

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


1

অন্য পদ্ধতির উপরের এবং নীচের লেবেলগুলিতে যথাক্রমে ভিউ শীর্ষ এবং নীচে সম্পর্কিত সীমাবদ্ধতা থাকতে পারে এবং মধ্যম দৃশ্যের সাথে প্রথম এবং তৃতীয় দৃশ্যের সাথে যথাক্রমে উপরের এবং নীচের সীমাবদ্ধতা থাকতে পারে।

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

এই ক্ষেত্রে আপনি তারপরে পুনরায় আকার দেওয়ার অনুমতি দেওয়ার জন্য "সমান" এর পরিবর্তে "বৃহত্তর বা সমান" হতে বাঞ্ছনীয় মানটিকে পরিবর্তন করতে চান। নিশ্চিত না যে এটি আপনি যা চান ঠিক তা করবে কিনা।


1

ইন্টারফেসবিল্ডারে এটি সমাধানের খুব সহজ উপায়:

কেন্দ্রের লেবেল (লেবেল 2) "কনটেইনার মধ্যে অনুভূমিক কেন্দ্র" এবং "কনটেইনার মধ্যে উল্লম্ব কেন্দ্র" সেট করুন

কেন্দ্রিক লেবেল এবং শীর্ষ লেবেল (লেবেল 1 + লেবেল 2) নির্বাচন করুন এবং উল্লম্ব ব্যবধানের জন্য TWO সীমাবদ্ধতা যুক্ত করুন । এক সঙ্গে এর চেয়ে বড় বা সমান মিনিট ব্যবধান। এক সঙ্গে কম বা সমান সর্বোচ্চ ব্যবধান।

কেন্দ্রিক লেবেল এবং নীচের লেবেলের জন্য একই (লেবেল 2 + ​​লেবেল 3)।

অতিরিক্ত হিসাবে আপনি লেবেল 1 - শীর্ষ স্থান থেকে সুপারভিউ এবং লেবেল 2 - নীচে স্পেস থেকে সুপারভিউতে দুটি সীমাবদ্ধতা দুটি সীমাবদ্ধতা যুক্ত করতে পারেন।

ফলাফলটি হবে যে সমস্ত 4 স্পেসিং তাদের আকারগুলি সমানভাবে পরিবর্তন করবে।


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

1

আমি একটি ফাংশন তৈরি করেছি যা সাহায্য করতে পারে। এই ব্যবহারের উদাহরণ:

 [self.view addConstraints: [NSLayoutConstraint fluidConstraintWithItems:NSDictionaryOfVariableBindings(button1, button2, button3)
                                                                asString:@[@"button1", @"button2", @"button3"]
                                                               alignAxis:@"V"
                                                          verticalMargin:100
                                                        horizontalMargin:50
                                                             innerMargin:25]];

এই উল্লম্ব বিতরণ ঘটায় (দুঃখিত চিত্রগুলি এম্বেড করার জন্য 10 খ্যাতি নেই)। এবং যদি আপনি অক্ষ এবং কিছু মার্জিন মান পরিবর্তন করেন:

alignAxis:@"H"
verticalMargin:120
horizontalMargin:20
innerMargin:10

আপনি যে অনুভূমিক বিতরণ পাবেন

আমি আইওএসে নবাগত কিন্তু ভয়েলি!

EvenDistribution.h

@interface NSLayoutConstraint (EvenDistribution)

/**
 * Returns constraints that will cause a set of subviews
 * to be evenly distributed along an axis.
 */
+ (NSArray *)  fluidConstraintWithItems:(NSDictionary *) views
                               asString:(NSArray *) stringViews
                              alignAxis:(NSString *) axis
                         verticalMargin:(NSUInteger) vMargin
                       horizontalMargin:(NSUInteger) hMargin
                            innerMargin:(NSUInteger) inner;
@end

EvenDistribution.m

#import "EvenDistribution.h"

@implementation NSLayoutConstraint (EvenDistribution)

+ (NSArray *) fluidConstraintWithItems:(NSDictionary *) dictViews
                              asString:(NSArray *) stringViews
                             alignAxis:(NSString *) axis
                        verticalMargin:(NSUInteger) vMargin
                      horizontalMargin:(NSUInteger) hMargin
                           innerMargin:(NSUInteger) iMargin

{
    NSMutableArray *constraints = [NSMutableArray arrayWithCapacity: dictViews.count];
    NSMutableString *globalFormat = [NSMutableString stringWithFormat:@"%@:|-%d-",
                                     axis,
                                     [axis isEqualToString:@"V"] ? vMargin : hMargin
                                     ];



        for (NSUInteger i = 0; i < dictViews.count; i++) {

            if (i == 0)
                [globalFormat appendString:[NSString stringWithFormat: @"[%@]-%d-", stringViews[i], iMargin]];
            else if(i == dictViews.count - 1)
                [globalFormat appendString:[NSString stringWithFormat: @"[%@(==%@)]-", stringViews[i], stringViews[i-1]]];
            else
               [globalFormat appendString:[NSString stringWithFormat: @"[%@(==%@)]-%d-", stringViews[i], stringViews[i-1], iMargin]];

            NSString *localFormat = [NSString stringWithFormat: @"%@:|-%d-[%@]-%d-|",
                                     [axis isEqualToString:@"V"] ? @"H" : @"V",
                                     [axis isEqualToString:@"V"] ? hMargin : vMargin,
                                     stringViews[i],
                                     [axis isEqualToString:@"V"] ? hMargin : vMargin];

            [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:localFormat
                                                                                     options:0
                                                                                     metrics:nil
                                                                                       views:dictViews]];


    }
    [globalFormat appendString:[NSString stringWithFormat:@"%d-|",
                                [axis isEqualToString:@"V"] ? vMargin : hMargin
                                ]];

    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:globalFormat
                                                                             options:0
                                                                             metrics:nil
                                                                               views:dictViews]];

    return constraints;

}

@end

1

হ্যাঁ, আপনি কেবল ইন্টারফেস বিল্ডারে এবং কোড না লিখেই এটি করতে পারেন - একটি সতর্কতা হ'ল আপনি সাদা স্থান বিতরণের পরিবর্তে লেবেলের আকার পরিবর্তন করছেন। এই ক্ষেত্রে, লেবেল 2 এর এক্স এবং ওয়াইকে তত্ত্বাবধানে সারিবদ্ধ করুন যাতে এটি কেন্দ্রে স্থির হয়। তারপরে তদারকীতে লেবেল 1 এর উল্লম্ব স্থানটি সেট করুন এবং 2 স্ট্যান্ডার্ডকে লেবেল করুন, 3 লেবেলের জন্য পুনরাবৃত্তি করুন After লেবেল 2 সেট করার পরে 1 এবং 3 লেবেল সেট করার সহজতম উপায় হ'ল তারা স্ন্যাপ না হওয়া পর্যন্ত তাদের পুনরায় আকার দেওয়া।

অনুভূমিক প্রদর্শন এখানে, নোট 1 এবং 2 এর মধ্যে উল্লম্ব স্থানটি মানকে সেট করা আছে তা নোট করুন:অনুভূমিক প্রদর্শন

এবং এখানে প্রতিকৃতি সংস্করণ:এখানে চিত্র বর্ণনা লিখুন

আমি বুঝতে পারি যে লেবেলের মধ্যে স্ট্যান্ডার্ড স্পেস এবং সুপারভিউতে স্ট্যান্ডার্ড স্পেসের মধ্যে পার্থক্যের কারণে তারা বেসলাইনগুলির মধ্যে একেবারে 100% সমানভাবে ব্যবধানে নেই। যদি এটি আপনাকে বিরক্ত করে, মানের পরিবর্তে আকারটি 0 তে সেট করুন


1

আমি প্রথম আইটেমের জন্য একটি প্রস্থের মান সেট করে (> = একটি প্রস্থ) এবং প্রতিটি আইটেমের মধ্যে সর্বনিম্ন দূরত্ব (> = একটি দূরত্ব)। তারপরে আমি দ্বিতীয়টির তৃতীয়, তৃতীয় ... আইটেমগুলির মধ্যে নির্ভরতাগুলি শৃঙ্খলায় টেনে আনতে Ctrl ব্যবহার করি।

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


1

পার্টিতে দেরীতে তবে ফাঁক দিয়ে অনুভূমিকভাবে মেনু তৈরির জন্য আমার একটি কার্যকরী সমাধান রয়েছে। এটি ==এনএসএলআউটকন্ট্রেন্ট ব্যবহার করে সহজেই করা যায়

const float MENU_HEIGHT = 40;

- (UIView*) createMenuWithLabels: (NSArray *) labels
    // labels is NSArray of NSString
    UIView * backgroundView = [[UIView alloc]init];
    backgroundView.translatesAutoresizingMaskIntoConstraints = false;

    NSMutableDictionary * views = [[NSMutableDictionary alloc] init];
    NSMutableString * format = [[NSMutableString alloc] initWithString: @"H:|"];
    NSString * firstLabelKey;

    for(NSString * str in labels)
    {
        UILabel * label = [[UILabel alloc] init];
        label.translatesAutoresizingMaskIntoConstraints = false;
        label.text = str;
        label.textAlignment = NSTextAlignmentCenter;
        label.textColor = [UIColor whiteColor];
        [backgroundView addSubview: label];
        [label fixHeightToTopBounds: MENU_HEIGHT-2];
        [backgroundView addConstraints: [label fixHeightToTopBounds: MENU_HEIGHT]];
        NSString * key = [self camelCaseFromString: str];
        [views setObject: label forKey: key];
        if(firstLabelKey == nil)
        {
            [format appendString: [NSString stringWithFormat: @"[%@]", key]];
            firstLabelKey = key;
        }
        else
        {
            [format appendString: [NSString stringWithFormat: @"[%@(==%@)]", key, firstLabelKey]];
        }
    }

    [format appendString: @"|"];

    NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat: (NSString *) format
                                                                               options: 0
                                                                               metrics: nil
                                                                                 views: (NSDictionary *) views];
    [backgroundView addConstraints: constraints];
    return backgroundView;
}

0

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

public enum LayoutConstraintChainStyle {
    case spread //Evenly distribute between the anchors
    case spreadInside //Pin the first & last views to the sides and then evenly distribute
    case packed //The views have a set space but are centered between the anchors.
}

public extension NSLayoutConstraint {

    static func chainHorizontally(views: [UIView],
                                  leadingAnchor: NSLayoutXAxisAnchor,
                                  trailingAnchor: NSLayoutXAxisAnchor,
                                  spacing: CGFloat = 0.0,
                                  style: LayoutConstraintChainStyle = .spread) -> [NSLayoutConstraint] {
    var constraints = [NSLayoutConstraint]()
    guard views.count > 1 else { return constraints }
    guard let first = views.first, let last = views.last, let superview = first.superview else { return constraints }

    //Setup the chain of views
    var distributionGuides = [UILayoutGuide]()
    var previous = first
    let firstGuide = UILayoutGuide()
    superview.addLayoutGuide(firstGuide)
    distributionGuides.append(firstGuide)
    firstGuide.identifier = "ChainDistribution\(distributionGuides.count)"
    constraints.append(firstGuide.leadingAnchor.constraint(equalTo: leadingAnchor))
    constraints.append(first.leadingAnchor.constraint(equalTo: firstGuide.trailingAnchor, constant: spacing))
    views.dropFirst().forEach { view in
        let g = UILayoutGuide()
        superview.addLayoutGuide(g)
        distributionGuides.append(g)
        g.identifier = "ChainDistribution\(distributionGuides.count)"
        constraints.append(contentsOf: [
            g.leadingAnchor.constraint(equalTo: previous.trailingAnchor),
            view.leadingAnchor.constraint(equalTo: g.trailingAnchor)
        ])
        previous = view
    }
    let lastGuide = UILayoutGuide()
    superview.addLayoutGuide(lastGuide)
    constraints.append(contentsOf: [lastGuide.leadingAnchor.constraint(equalTo: last.trailingAnchor),
                                    lastGuide.trailingAnchor.constraint(equalTo: trailingAnchor)])
    distributionGuides.append(lastGuide)

    //Space the according to the style.
    switch style {
    case .packed:
        if let first = distributionGuides.first, let last = distributionGuides.last {
            constraints.append(first.widthAnchor.constraint(greaterThanOrEqualToConstant: spacing))
            constraints.append(last.widthAnchor.constraint(greaterThanOrEqualToConstant: spacing))
            constraints.append(last.widthAnchor.constraint(equalTo: first.widthAnchor))
            constraints.append(contentsOf:
                distributionGuides.dropFirst().dropLast()
                    .map { $0.widthAnchor.constraint(equalToConstant: spacing) }
                )
        }
    case .spread:
        if let first = distributionGuides.first {
            constraints.append(contentsOf:
                distributionGuides.dropFirst().map { $0.widthAnchor.constraint(equalTo: first.widthAnchor) })
        }
    case .spreadInside:
        if let first = distributionGuides.first, let last = distributionGuides.last {
            constraints.append(first.widthAnchor.constraint(equalToConstant: spacing))
            constraints.append(last.widthAnchor.constraint(equalToConstant: spacing))
            let innerGuides = distributionGuides.dropFirst().dropLast()
            if let key = innerGuides.first {
                constraints.append(contentsOf:
                    innerGuides.dropFirst().map { $0.widthAnchor.constraint(equalTo: key.widthAnchor) }
                )
            }
        }
    }

    return constraints
}

0

আমি অনুভূমিকভাবে 5 টি চিত্র সারিবদ্ধ করতে চেয়েছিলাম, তাই আমি সামান্য পার্থক্যের সাথে মেটের প্রতিক্রিয়া অনুসরণ করে শেষ করেছি ।

প্রথম চিত্রটি 0 টির সমান ধারক এবং 1: 5 এর গুণক: অনুভূমিকভাবে কেন্দ্রীভূত হবে:

প্রথম চিত্র

দ্বিতীয় চিত্রটি 0 টির সমান ধারক এবং 3: 5 এর গুণক: অনুভূমিকভাবে কেন্দ্রীভূত হবে: দ্বিতীয় চিত্র

এবং বাকি ইমেজগুলির মতো। উদাহরণস্বরূপ, পঞ্চম (এবং শেষ) চিত্রটি 0 টির সমান পাত্রে এবং 9: 5 এর গুণকটিতে অনুভূমিকভাবে কেন্দ্রিক হবে: শেষ চিত্র

মেটের ব্যাখ্যা অনুসারে, আদেশটি 1, 3, 5, 7, 9, ইত্যাদি যায় the


-1

আপনি কেবল একটি টেবিলভিউ তৈরি এবং তৈরি করবেন না কেন isScrollEnabled = false


ডাউনভোটটি বুঝতে পারছেন না, আমার সমাধানটি বাক্সের বাইরে ভাবছে। কোকো আপনাকে ইউআইটিএবলভিউতে একটি তালিকা দিলে অটোলেআউট দিয়ে একটি তালিকা তৈরির মাথা ব্যথা কেন কাটবে?
জোশ ও'কনোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.