ভিজ্যুয়াল ফরম্যাট ভাষা ব্যবহার করে এর তত্ত্বাবধানে একটি দৃশ্যকে কেন্দ্র করে


160

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

এটি একটি জিনিস ব্যতীত সমস্ত কিছুই ঠিকঠাক কাজ করে: আমি কেবল তার তত্ত্বাবধানের মধ্যে কেন্দ্রে কোনও দৃশ্য পেতে পারি না।
ভিএফএল দিয়ে এটি কি সম্ভব বা নিজে নিজেই আমার প্রতিবন্ধকতা তৈরি করা দরকার?

উত্তর:


232

বর্তমানে, না, দেখে মনে হচ্ছে না কেবল ভিএফএল ব্যবহার করে তত্ত্বাবধানে কোনও দৃশ্যকে কেন্দ্র করা সম্ভব । তবে এটি কোনও একক ভিএফএল স্ট্রিং এবং একক অতিরিক্ত বাধা (প্রতিটি অক্ষ) প্রতি ব্যবহার করে এটি করা কঠিন নয়:

VFL: "|-(>=20)-[view]-(>=20)-|"

[NSLayoutConstraint constraintWithItem:view
                             attribute:NSLayoutAttributeCenterX
                             relatedBy:NSLayoutRelationEqual
                                toItem:view.superview
                             attribute:NSLayoutAttributeCenterX
                            multiplier:1.f constant:0.f];

কেউ ভাবেন যে আপনি কেবল এটি করতে সক্ষম হবেন (যা আমি প্রথমে এই প্রশ্নটি দেখে প্রথমে ভেবেছিলাম এবং চেষ্টা করেছি):

[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
                                 options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
                                 metrics:nil
                                   views:@{@"view" : view}];

আমি এটিকে আমার ইচ্ছার দিকে বাঁকানোর চেষ্টা করে উপরের বিভিন্ন পরিবর্তনের চেষ্টা করেছি, তবে উভয় অক্ষের জন্য পৃথকভাবে দুটি পৃথক ভিএফএল স্ট্রিং থাকা সত্ত্বেও এটি তত্ত্বাবধানে প্রয়োগ করা হবে বলে মনে হয় না H:|V:। আমি তখন চেষ্টা করতে শুরু করেন এবং ঠিক বিছিন্ন যখন অপশন না VFL প্রয়োগ দেখায়। এগুলি ভিএফএল-তে তত্ত্বাবধানে প্রয়োগ হয় না বলে মনে হয় এবং কেবলমাত্র ভিএফএল স্ট্রিংয়ে উল্লিখিত কোনও স্পষ্ট মতামতের জন্য এটি প্রয়োগ করা হবে (যা কিছু ক্ষেত্রে হতাশাব্যঞ্জক)।

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

বলা বাহুল্য, ভিএফএল সম্পর্কে এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করার বিষয়ে আমি অনেক কিছু শিখেছি।


2
বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ। আমার ভিএফএল ব্যবহারের একমাত্র কারণ, তবে those কুরুচিপূর্ণ বাধাগুলি থেকে মুক্তি পাচ্ছে। খুব খারাপ অ্যাপল এটি এখনও সমর্থন করে না ...
ক্রিশ্চিয়ান শনর

@laracus আপনি নীচের উত্তরটি কেন কাজ করে তা মন্তব্য করতে পারেন? এটা আমার স্ট্যাম্পড পেয়েছে।
ম্যাট জি

8
নীচে অ্যাভজেনির উত্তর কাজ করে কারণ অটোলেআউট ইঞ্জিন আচরণ করে |এবং [superview]পৃথক অভ্যন্তরীণ সত্তা হিসাবে বিবেচনা করে যদিও তারা একই শব্দার্থক বস্তুর প্রতিনিধিত্ব করে। ব্যবহার করে [superview], অটোলেআউট তার প্রান্তিককরণের মেট্রিকগুলিতে তত্ত্বাবধানের অবজেক্টটি অন্তর্ভুক্ত করছে (গিথুব লিঙ্কে তার উত্তরে, এটি NSLayoutFormatAlignAllCenterY/ Xমেট্রিক)।
লারাকাস

অ্যালারাসাস আশ্চর্যজনক, ধন্যবাদ!
ম্যাট জি

আমরা কি জানি যে সীমাবদ্ধতাটি এখনও ভিওএফএল সংস্করণে প্রযোজ্য যা বর্তমান আইওএস x.x সহ প্রেরিত হয়?
ড্রাক্স

138

হ্যাঁ, ভিজ্যুয়াল ফর্ম্যাট ল্যাঙ্গুয়েজ দিয়ে তার তত্ত্বাবধানে একটি দৃশ্যকে কেন্দ্র করা সম্ভব। উভয় উল্লম্ব এবং অনুভূমিকভাবে। এখানে ডেমো:

https://github.com/evgenyneu/center-vfl


15
এটি দুর্দান্ত, আপনি কি মনে করেন আপনি এটিকে প্রসারিত করতে পারেন এবং ব্যাখ্যা করেন যে এটি কেন কাজ করে?
টেপি

3
আমি চিহ্নিত উত্তরের কাছাকাছি কিছু ব্যবহার করে শেষ করেছি, তবে আপনার মধ্যে গিথাব সংযুক্তির জন্য +1
রেমব্র্যান্ড কিউ আইনস্টাইন

4
@ ড্যান যদি এটি আপনার পক্ষে কাজ করে না, আপনার প্রস্থ এবং উচ্চতার জন্যও জায়গা থাকতে পারে বাধা থাকতে পারে। ভিএফএলটি প্রস্থের জন্য এর মতো হবে: @ "[লেবেল (== 200)]" এবং উচ্চতার জন্য এটি পছন্দ: @ "ভি: [লেবেল (== 200)]" "
জোনাথন ঝাঁ

1
ফলাফল কেন | এবং [সুপারভিউ] আলাদা? এটি কি এমন কিছু যা রাডার হওয়া উচিত বা এমন কিছু চলছে যা আমি অনুসরণ করছি না?
ম্যাট জি

3
সীমাবদ্ধ বিন্যাসটি বিশ্লেষণ করতে অক্ষম: বিকল্পগুলি মুখোশটি অনুভূমিক প্রান্তে প্রান্তিককরণের জন্য প্রয়োজনীয় ভিউগুলি প্রয়োজন, যা এমন অনুভূমিক বিন্যাসের জন্যও অনুমোদিত নয়। এইচ: [সুপারভিউ] - (<= 1) - [লেবেল 1]
গ্রিকার

82

আমি মনে করি ম্যানুয়ালি সীমাবদ্ধতা তৈরি করা ভাল।

[superview addConstraint:
 [NSLayoutConstraint constraintWithItem:view
                              attribute:NSLayoutAttributeCenterX
                              relatedBy:NSLayoutRelationEqual
                                 toItem:superview
                              attribute:NSLayoutAttributeCenterX
                             multiplier:1
                               constant:0]];
[superview addConstraint:
 [NSLayoutConstraint constraintWithItem:view
                              attribute:NSLayoutAttributeCenterY
                              relatedBy:NSLayoutRelationEqual
                                 toItem:superview
                              attribute:NSLayoutAttributeCenterY
                             multiplier:1
                               constant:0]];

এখন আমরা স্বয়ংক্রিয়ভাবে লেআউটটিকে সংজ্ঞায়িত করতে NSLayoutAncor ব্যবহার করতে পারি:

(আইওএস 9.0 এবং তার পরে উপলব্ধ)

view.centerXAnchor.constraint(equalTo: superview.centerXAnchor).isActive = true
view.centerYAnchor.constraint(equalTo: superview.centerYAnchor).isActive = true

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

view.snp.makeConstraints({ $0.center.equalToSuperview() })

1
আমার প্রসঙ্গে সবচেয়ে ভাল কাজ করেছেন - যদিও কোনও ভিএফএল নেই।
ব্রেইনারে

এটি আমাকে একটি সতর্কতা দেয়:Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
তাপস পাল

10

একেবারে সম্ভব এটি এটি করতে সক্ষম হয়েছিল:

[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view]-(<=1)-[subview]"
                                        options:NSLayoutFormatAlignAllCenterY
                                        metrics:nil
                                          views:NSDictionaryOfVariableBindings(view, subview)];

এখান থেকে শিখেছি উপরের কোডগুলি কেন্দ্রের সাবউভিউ ওয়াই দ্বারা দৃশ্যমান view

Swift3:

        NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-(<=1)-[subview]",
                                       options: .alignAllCenterY,
                                                       metrics: nil,
                                                       views: ["view":self, "subview":_spinnerView])

7

নীচে কোড যুক্ত করুন এবং আপনার বোতামটি স্ক্রিনের মাঝখানে রাখুন। একেবারে সম্ভব।

[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"H:|-[button]-|"
                           options:NSLayoutFormatAlignAllCenterY
                           metrics:0
                           views:views]];

[self.view addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"V:|-[button]-|"
                           options:NSLayoutFormatAlignAllCenterX
                           metrics:0
                           views:views]];

1

আমি জানি এটি আপনি চান না তবে আপনি অবশ্যই মার্জিনগুলি গণনা করতে পারেন এবং ভিজ্যুয়াল বিন্যাসের স্ট্রিং তৈরি করতে এগুলি ব্যবহার করতে পারেন;)

যাইহোক, না। দুর্ভাগ্যক্রমে ভিএফএল দিয়ে 'স্বয়ংক্রিয়ভাবে' এটি করা সম্ভব নয় - কমপক্ষে এখনও হয়নি।


ভাল, আপনি এনএসএসআর স্ট্রিংওথফর্ম্যাট ব্যবহার করতে পারেন: রানটাইম সময়ে আপনার ভিএফএল স্ট্রিং গতিশীলভাবে তৈরি করতে।
TRVD1707

1

@ অ্যাভেজেনি এর উত্তরের জন্য ধন্যবাদ, আমি সারাংশে একটি সম্পূর্ণ উদাহরণ তৈরি করেছি:

লাল বর্গক্ষেত্রটি কাস্টম উচ্চতার সাথে উল্লম্বভাবে কেন্দ্র করুন

https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626

আপনি ভিএফএল (যা বেশ স্বজ্ঞাত নয়) ব্যবহার করে বা ম্যানুয়ালি সীমাবদ্ধতা ব্যবহার করে উল্লম্বভাবে একটি দৃশ্যকে কেন্দ্র করতে পারেন। যাইহোক, আমি ভিএফএল এর মধ্যে কেন্দ্রের উচ্চতা এবং উচ্চতা উভয়কে একত্রিত করতে পারি না:

"H:[subView]-(<=1)-[followIcon(==customHeight)]"

বর্তমান সমাধানে ভিএফএল সীমাবদ্ধতা পৃথকভাবে যুক্ত করা হয়।


0

এটি কী করতে হবে তা হল অভিধানে সুপারভিউ ঘোষণা করা উচিত। পরিবর্তে |আপনি ব্যবহার ব্যবহার করুন @{@"super": view.superview};

এবং NSLayoutFormatAlignAllCenterXউল্লম্ব জন্য এবং NSLayoutFormatAlignAllCenterYবিকল্প হিসাবে অনুভূমিক জন্য।


0

আপনি অতিরিক্ত দর্শন ব্যবহার করতে পারেন।

NSDictionary *formats =
@{
  @"H:|[centerXView]|": @0,
  @"V:|[centerYView]|": @0,
  @"H:[centerYView(0)]-(>=0)-[yourView]": @(NSLayoutFormatAlignAllCenterY),
  @"V:[centerXView(0)]-(>=0)-[yourView]": @(NSLayoutFormatAlignAllCenterX),
};
NSDictionary *views = @{
  @"centerXView": centerXView, 
  @"centerYView": centerYView, 
  @"yourView": yourView,
};
 ^(NSString *format, NSNumber *options, BOOL *stop) {
     [superview addConstraints:
      [NSLayoutConstraint constraintsWithVisualFormat:format
                                              options:options.integerValue
                                              metrics:nil
                                                views:views]];
 }];

আপনি যদি এটি ঝরঝরে চান, তবে centerXView.hidden = centerYView.hidden = YES;

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


এখানে কিছু অনুপস্থিত। দর্শন ঘোষণার আওতায় আপনি কীভাবে ব্লকটিকে কল করবেন ? এটি যেভাবে আপনি রেখেছেন এটি কোনও আইনি কোড নয়
ইশাহাক

0

যারা এখানে Interface Builderভিত্তিযুক্ত সমাধানের জন্য এসেছেন (গুগল আমাকে এখানে নিয়ে যায়), কেবল প্রস্থের প্রশস্ততা / উচ্চতার সীমাবদ্ধতা যুক্ত করুন এবং উপদর্শনটি -> এটির তত্ত্বাবধানে নিয়ন্ত্রণ টানুন -> "সুপারভিউতে উল্লম্বভাবে / অনুভূমিকভাবে কেন্দ্র" নির্বাচন করুন।


0

এটি আমার পদ্ধতি

//create a 100*100 rect in the center of superView
var consts = NSLayoutConstraint.constraints(withVisualFormat: "H:|-space-[myView]-space-|", options: [], metrics:["space":view.bounds.width/2-50], views:["myView":myView])

consts += NSLayoutConstraint.constraints(withVisualFormat: "V:|-space-[myView]-space-|", options: [], metrics: ["space":view.bounds.height/2-50], views: ["myView":myView])

-1

শুধু এটুকু বলা দরকার যে আপনি সীমাবদ্ধতার পরিবর্তে এটি ব্যবহার করতে পারেন:

child.center = [parent convertPoint:parent.center fromView:parent.superview];

4
শুধু
এটুকু


-3

ভিএফএল ব্যবহার না করে আপনি ইন্টারফেস বিল্ডারে এটি সহজেই করতে পারেন। মেইন স্টোরিবোর্ডে, আপনি যে ভিউটি কেন্দ্র করতে চান তাতে ctrl + ক্লিক করুন। সুপারভিউতে টানুন (সিটিআরএল ধরে থাকাকালীন) এবং "সেন্টার এক্স" বা "সেন্টার ওয়াই" নির্বাচন করুন। কোনও কোডের দরকার নেই।

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