এক্সকোড 6-এ অটোলআউট সীমাবদ্ধতাগুলি ব্যবহার করে দিক-ফিটের আচরণ অনুকরণ করা


336

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

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

কনটেইনার ভিউয়ের অনুপাতটি যদি সাবউভিউয়ের চেয়ে বৃহত্তর হয়, তবে আমি সাবউউয়ের উচ্চতা পিতামাতার দৃশ্যের উচ্চতার সমান করতে চাই।

কনটেইনার ভিউয়ের অনুপাতটি যদি সাবউভিউয়ের চেয়ে লম্বা হয়, তবে আমি সাবভিউয়ের প্রস্থটি পিতামাতার দৃশ্যের প্রস্থের সাথে সমান করতে চাই।

উভয় ক্ষেত্রেই আমি মতামতটি কনটেইনার ভিউয়ের মধ্যে অনুভূমিকভাবে এবং উলম্বভাবে কেন্দ্রীভূত করতে চাই।

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

উত্তর:


1046

আপনি স্কেল টু ফিট বর্ণনা করছেন না; আপনি দিক-ফিট বর্ণনা করছেন। (আমি এই বিষয়ে আপনার প্রশ্নটি সম্পাদনা করেছি)) এর দৃষ্টিভঙ্গিটি বজায় রেখে এবং পুরোপুরি তার পিতামাতার অভ্যন্তরে পুরোপুরি ফিট করার সময় সংক্ষিপ্তসারটি যথাসম্ভব বড় হয়ে যায়।

যাইহোক, আপনি অটো লেআউট দিয়ে এটি করতে পারেন। আপনি এটি Xcode 5.1 হিসাবে সম্পূর্ণ আইবিতে করতে পারেন। আসুন কিছু মতামত দিয়ে শুরু করা যাক:

কিছু মতামত

হালকা সবুজ বর্ণের একটি অনুপাত 4: 1 রয়েছে। গা green় সবুজ বর্ণের একটি অনুপাত 1: 4 রয়েছে। আমি সীমাবদ্ধতাগুলি সেট করতে যাচ্ছি যাতে নীল ভিউ স্ক্রিনের উপরের অর্ধেকটি পূর্ণ করে দেয়, গোলাপী ভিউ স্ক্রিনের নীচের অর্ধেকটি পূরণ করে এবং প্রতিটি সবুজ ভিউ তার দিক অনুপাত বজায় রাখার সময় এবং যতটা সম্ভব ফিট করে ধারক।

প্রথমত, আমি নীল দৃশ্যের চারদিকে বাধা তৈরি করব আমি এটি 0 এর দূরত্বের সাথে প্রতিটি প্রান্তের নিকটতম প্রতিবেশীর কাছে এটি পিন করব I

নীল সীমাবদ্ধতা

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

এরপরে, আমি গোলাপী দৃশ্যের বাম, নীচে এবং ডান প্রান্তটিকে নিকটতম প্রতিবেশীর কাছে পিন করছি। আমার উপরের প্রান্তটি সীমাবদ্ধ করার দরকার নেই কারণ এর শীর্ষ প্রান্তটি ইতিমধ্যে নীল দর্শনের নীচের প্রান্তে সীমাবদ্ধ।

গোলাপী প্রতিবন্ধকতা

আমারও গোলাপী এবং নীল দৃষ্টিভঙ্গির মধ্যে সমান উচ্চতা সীমাবদ্ধতা প্রয়োজন। এটি তাদের প্রত্যেককে অর্ধেক স্ক্রিন পূরণ করবে:

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

আমি যদি এখন এক্সকোডকে সমস্ত ফ্রেম আপডেট করতে বলি তবে আমি এটি পেয়েছি:

পাত্রে বিছানো

সুতরাং আমি এখনও পর্যন্ত সীমাবদ্ধতাগুলি ঠিক করেছি। আমি এটিকে পূর্বাবস্থায় ফেলি এবং হালকা সবুজ দৃশ্যে কাজ শুরু করি।

হালকা সবুজ দর্শনের দিকটি ফিট করার জন্য পাঁচটি প্রতিবন্ধকতা প্রয়োজন:

  • হালকা সবুজ দর্শনে প্রয়োজনীয়-অগ্রাধিকারের দিক অনুপাতের সীমাবদ্ধতা। আপনি এই সীমাবদ্ধতাটি এক্সকোড 5.1 বা তার পরে কোনও এক্সিব বা স্টোরিবোর্ডে তৈরি করতে পারেন।
  • হালকা সবুজ দর্শনের প্রস্থের ধারকটির প্রস্থের চেয়ে কম বা সমান হতে সীমাবদ্ধ একটি প্রয়োজনীয়-অগ্রাধিকারের সীমাবদ্ধতা।
  • হালকা সবুজ দর্শনের প্রস্থকে তার ধারকটির প্রস্থের সমান হতে একটি উচ্চ-অগ্রাধিকারের সীমাবদ্ধতা।
  • হালকা সবুজ দৃশ্যের উচ্চতাটিকে তার ধারকটির উচ্চতার চেয়ে কম বা সমান হতে সীমাবদ্ধ একটি প্রয়োজনীয়-অগ্রাধিকারের সীমাবদ্ধতা।
  • হালকা সবুজ দৃশ্যের উচ্চতাটিকে তার ধারকটির উচ্চতার সমান করতে একটি উচ্চ-অগ্রাধিকারের সীমাবদ্ধতা।

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

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

সুতরাং আমি প্রথমে অনুপাতের অনুপাতের সীমাবদ্ধতা তৈরি করি:

শীর্ষ দিক

তারপরে আমি ধারকটির সাথে সমান প্রস্থ এবং উচ্চতার সীমাবদ্ধতাগুলি তৈরি করি:

শীর্ষ সমান আকার

আমাকে এই বাধাগুলি সম্পাদনা করতে হবে কম-বা সম-সীমাবদ্ধতার চেয়ে কম:

চেয়ে কম বা সমান আকারের শীর্ষে

এরপরে আমার ধারকটির সাথে সমান প্রস্থ এবং উচ্চতার সীমাবদ্ধতার আরও একটি সেট তৈরি করতে হবে:

আবার শীর্ষ সমান আকার

এবং আমার এই নতুন বাধাগুলি প্রয়োজনীয় অগ্রাধিকারের চেয়ে কম করা দরকার:

শীর্ষ সমান প্রয়োজন হয় না

অবশেষে, আপনি সংক্ষিপ্তসারটিকে তার ধারককে কেন্দ্র করে রাখতে বলেছিলেন, তাই আমি এই সীমাবদ্ধতাগুলি সেট আপ করব:

শীর্ষ কেন্দ্রিক

এখন পরীক্ষা করার জন্য, আমি ভিউ কন্ট্রোলারটি নির্বাচন করব এবং এক্সকোডকে সমস্ত ফ্রেম আপডেট করতে বলব। এটি আমি পেয়েছি:

ভুল শীর্ষ লেআউট

ওহো! সাবউভিউটি তার ধারককে পুরোপুরি পূরণ করতে প্রসারিত হয়েছে। যদি আমি এটি নির্বাচন করি তবে আমি দেখতে পাচ্ছি যে বাস্তবে এটি এর অনুপাতের অনুপাত বজায় রেখেছে, তবে এটি একটি দিক- ফিটের পরিবর্তে একটি দিকটি পূরণ করছে ।

সমস্যাটি হ'ল কম-বা-সমান সীমাবদ্ধতার ক্ষেত্রে, সীমাবদ্ধতার প্রতিটি প্রান্তে দৃষ্টিভঙ্গিটি গুরুত্বপূর্ণ এবং Xcode আমার প্রত্যাশার বিপরীতে এই সীমাবদ্ধতা স্থাপন করেছে। আমি দুটি বাধা প্রতিটি বেছে নিতে এবং তার প্রথম এবং দ্বিতীয় আইটেমগুলি বিপরীত করতে পারে। পরিবর্তে, আমি কেবলমাত্র সংক্ষিপ্ত বিবরণটি নির্বাচন করব এবং সীমাবদ্ধতাগুলিকে বৃহত্তর বা সমান হিসাবে পরিবর্তন করব:

শীর্ষ সীমাবদ্ধতাগুলি ঠিক করুন

এক্সকোড লেআউট আপডেট করে:

সঠিক শীর্ষ বিন্যাস

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

উপরের এবং নীচের লেআউটটি সঠিক করুন

এখন আমি এটিকে আইফোন 4 এস সিমুলেটরে চালাতে পারি, যার আইবি ব্যবহারের চেয়ে আলাদা স্ক্রিন আকার এবং পরীক্ষার ঘূর্ণন:

আইফোন 4 এস পরীক্ষা

এবং আমি আইফোন 6 সিমুলেটারে পরীক্ষা করতে পারি:

আইফোন 6 পরীক্ষা

আপনার সুবিধার জন্য আমি আমার চূড়ান্ত স্টোরিবোর্ডটি এই সংক্ষেপে আপলোড করেছি ।


27
আমি লিসেক্যাপ ব্যবহার করেছি । এটি বিনামূল্যে (জিপিএল) এবং সরাসরি জিআইএফ-র রেকর্ড করে। অ্যানিমেটেড জিআইএফ যতক্ষণ না 2 এমবি এর বেশি না থাকে, আপনি অন্য কোনও চিত্রের মতো এটি এই সাইটে পোস্ট করতে পারেন।
রব মায়ফ

1
@ লুকাটোরেলা কেবলমাত্র উচ্চ-অগ্রাধিকারের সীমাবদ্ধতার সাথে, লেআউটটি দ্বিপাক্ষিক। এটি আজ আপনার কাঙ্ক্ষিত ফলাফল পেয়েছে বলেই এটি আইওএসের পরবর্তী সংস্করণে আসবে না। ধরুন সাবউভিউটি অনুপাতের অনুপাত 1: 1 চায়, তত্ত্বাবধানটি আকারটি 99 × 100 হয় এবং আপনার কাছে কেবল প্রয়োজনীয় দিক-অনুপাত এবং উচ্চ-অগ্রাধিকারের সাম্যের সীমাবদ্ধতা রয়েছে। তারপরে অটো লেআউটটি সাবউভিউটি 99 size 99 (মোট ত্রুটি 1 সহ) বা আকার 100 × 100 (মোট ত্রুটি 1 সহ) আকারে সেট করতে পারে। একটি আকার দিক-ফিট; অন্যটি দিকটি পূরণ করুন। প্রয়োজনীয় সীমাবদ্ধতাগুলি যুক্ত করা একটি স্বতন্ত্র সর্বনিম্ন-ত্রুটি সমাধান উত্পাদন করে।
রব মায়ফ

1
@ লুকাটোরেলা দিক অনুপাতের সীমাবদ্ধতার প্রাপ্যতা সংক্রান্ত সংশোধনের জন্য ধন্যবাদ।
রব মায়ফ

11
মাত্র একটি পোস্ট সহ 10,000 টি উন্নত অ্যাপ ... অবিশ্বাস্য।
ডনউভন

2
বাহ .. স্ট্যাকের ওভারফ্লোতে আমি এখানে কখনও দেখেছি সেরা উত্তর .. এই স্যারের জন্য আপনাকে ধন্যবাদ ..
0yeoj

24

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

AspectFitView.h :

#import <UIKit/UIKit.h>

@interface AspectFitView : UIView

@property (nonatomic, strong) UIView *childView;

@end

AspectFitView.m :

#import "AspectFitView.h"

@implementation AspectFitView

- (void)setChildView:(UIView *)childView
{
    if (_childView) {
        [_childView removeFromSuperview];
    }

    _childView = childView;

    [self addSubview:childView];
    [self setNeedsLayout];
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_childView) {
        CGSize childSize = _childView.frame.size;
        CGSize parentSize = self.frame.size;
        CGFloat aspectRatioForHeight = childSize.width / childSize.height;
        CGFloat aspectRatioForWidth = childSize.height / childSize.width;

        if ((parentSize.height * aspectRatioForHeight) > parentSize.height) {
            // whole height, adjust width
            CGFloat width = parentSize.width * aspectRatioForWidth;
            _childView.frame = CGRectMake((parentSize.width - width) / 2.0, 0, width, parentSize.height);
        } else {
            // whole width, adjust height
            CGFloat height = parentSize.height * aspectRatioForHeight;
            _childView.frame = CGRectMake(0, (parentSize.height - height) / 2.0, parentSize.width, height);
        }
    }
}

@end

এরপরে, আপনি স্টোরিবোর্ডে নীল এবং গোলাপী দর্শনের শ্রেণি পরিবর্তন করতে হবে AspectFitView। অবশেষে আপনি আপনার ভিউকন্ট্রোলারের কাছে দুটি আউটলেট সেট করেছেন topAspectFitViewএবং সেগুলি এতে bottomAspectFitViewসেট childViewকরেছেন viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *top = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 100)];
    top.backgroundColor = [UIColor lightGrayColor];

    UIView *bottom = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 500)];
    bottom.backgroundColor = [UIColor greenColor];

    _topAspectFitView.childView = top;
    _bottomAspectFitView.childView = bottom;
}

সুতরাং কোডে এটি করা কঠিন নয় এবং এটি এখনও খুব মানিয়ে যায় এবং পরিবর্তনশীল-আকারের ভিউ এবং বিভিন্ন দিক অনুপাতের সাথে কাজ করে।

জুলাই 2015 আপডেট করুন: এখানে একটি ডেমো অ্যাপ্লিকেশন পান: https://github.com/jfahrenkrug/SPWKAspectFitView


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

1
প্রোগ্রামেটিক রেফারেন্স পাশাপাশি রাখতে খুব সহায়ক।
সিটিপেনরোজ

@ জোহানেসফাহরেনক্রুগ যদি আপনার টিউটোরিয়াল প্রকল্প থাকে, আপনি কি ভাগ করতে পারবেন? আপনাকে ধন্যবাদ :)
এরহান ডেমিরসি

1
@ ইরানডেমিরসি অবশ্যই, আপনি এখানে যান: github.com/jfahrenkrug/SPWKAspectFitView
জোহানেস

8

আমি গৃহীত উত্তর থেকে একটি সমাধান প্রয়োজন, কিন্তু কোড থেকে সম্পাদিত। আমি সর্বাধিক মার্জিত উপায়টি পেয়েছি রাজমিস্ত্রি কাঠামো ব্যবহার করা ।

#import "Masonry.h"

...

[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.width.equalTo(view.mas_height).multipliedBy(aspectRatio);
    make.size.lessThanOrEqualTo(superview);
    make.size.equalTo(superview).with.priorityHigh();
    make.center.equalTo(superview);
}];

5

এটি ম্যাকোসের জন্য।

ওএস এক্স অ্যাপ্লিকেশনটির দিকটি ফিট করে তোলার জন্য আমার রবের উপায় ব্যবহার করতে সমস্যা হচ্ছে। তবে আমি এটিকে অন্য উপায়ে তৈরি করেছি - প্রস্থ এবং উচ্চতা ব্যবহারের পরিবর্তে, আমি নেতৃত্বাধীন, চলমান, শীর্ষ এবং নীচের স্থানটি ব্যবহার করেছি।

মূলত, দুটি অগ্রণী স্পেস যুক্ত করুন যেখানে একটি হল> = 0 @ 1000 প্রয়োজনীয় অগ্রাধিকার এবং অন্যটি হল = 0 @ 250 নিম্ন অগ্রাধিকার। উপরের এবং নীচের জায়গাতে ট্রেলিংয়ে একই সেটিংস করুন।

অবশ্যই, আপনাকে দিক অনুপাত এবং কেন্দ্রের এক্স এবং সেন্টার ওয়াই সেট করতে হবে

এবং তারপরে কাজ শেষ!

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


আপনি কিভাবে এই প্রোগ্রামটিমেটিক কাজটি করতে যেতে পারেন?
ফ্যাটনুলার

@ ফেটনুলার কি কেবল এই পদক্ষেপগুলি অনুসরণ করছেন?
brianLikeApple

4

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

সমাধানটি ছিল কেবলমাত্র সমতুল্য এবং সমান-উচ্চতা সীমাবদ্ধতার অগ্রাধিকারের তুলনায় ইউআইআইমেজভিউয়ের সামগ্রী সংক্ষেপণ প্রতিরোধের অগ্রাধিকারটিকে কম সেট করা:

সামগ্রী সংক্ষেপণ প্রতিরোধ


2

এটি একটি কোড-কেন্দ্রিক পদ্ধতির @ লব_মায়ফের দুর্দান্ত উত্তরের একটি বন্দর যা NSLayoutAnchorবস্তুগুলি ব্যবহার করে এবং জামারিনে পোর্ট করা হয়েছে। আমার জন্য, NSLayoutAnchorএবং সম্পর্কিত ক্লাসগুলি অটলাউট প্রোগ্রামকে আরও সহজ করে তুলেছে:

public class ContentView : UIView
{
        public ContentView (UIColor fillColor)
        {
            BackgroundColor = fillColor;
        }
}

public class MyController : UIViewController 
{
    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        //Starting point:
        var view = new ContentView (UIColor.White);

        blueView = new ContentView (UIColor.FromRGB (166, 200, 255));
        view.AddSubview (blueView);

        lightGreenView = new ContentView (UIColor.FromRGB (200, 255, 220));
        lightGreenView.Frame = new CGRect (20, 40, 200, 60);

        view.AddSubview (lightGreenView);

        pinkView = new ContentView (UIColor.FromRGB (255, 204, 240));
        view.AddSubview (pinkView);

        greenView = new ContentView (UIColor.Green);
        greenView.Frame = new CGRect (80, 20, 40, 200);
        pinkView.AddSubview (greenView);

        //Now start doing in code the things that @rob_mayoff did in IB

        //Make the blue view size up to its parent, but half the height
        blueView.TranslatesAutoresizingMaskIntoConstraints = false;
        var blueConstraints = new []
        {
            blueView.LeadingAnchor.ConstraintEqualTo(view.LayoutMarginsGuide.LeadingAnchor),
            blueView.TrailingAnchor.ConstraintEqualTo(view.LayoutMarginsGuide.TrailingAnchor),
            blueView.TopAnchor.ConstraintEqualTo(view.LayoutMarginsGuide.TopAnchor),
            blueView.HeightAnchor.ConstraintEqualTo(view.LayoutMarginsGuide.HeightAnchor, (nfloat) 0.5)
        };
        NSLayoutConstraint.ActivateConstraints (blueConstraints);

        //Make the pink view same size as blue view, and linked to bottom of blue view
        pinkView.TranslatesAutoresizingMaskIntoConstraints = false;
        var pinkConstraints = new []
        {
            pinkView.LeadingAnchor.ConstraintEqualTo(blueView.LeadingAnchor),
            pinkView.TrailingAnchor.ConstraintEqualTo(blueView.TrailingAnchor),
            pinkView.HeightAnchor.ConstraintEqualTo(blueView.HeightAnchor),
            pinkView.TopAnchor.ConstraintEqualTo(blueView.BottomAnchor)
        };
        NSLayoutConstraint.ActivateConstraints (pinkConstraints);


        //From here, address the aspect-fitting challenge:

        lightGreenView.TranslatesAutoresizingMaskIntoConstraints = false;
        //These are the must-fulfill constraints: 
        var lightGreenConstraints = new []
        {
            //Aspect ratio of 1 : 5
            NSLayoutConstraint.Create(lightGreenView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, lightGreenView, NSLayoutAttribute.Width, (nfloat) 0.20, 0),
            //Cannot be larger than parent's width or height
            lightGreenView.WidthAnchor.ConstraintLessThanOrEqualTo(blueView.WidthAnchor),
            lightGreenView.HeightAnchor.ConstraintLessThanOrEqualTo(blueView.HeightAnchor),
            //Center in parent
            lightGreenView.CenterYAnchor.ConstraintEqualTo(blueView.CenterYAnchor),
            lightGreenView.CenterXAnchor.ConstraintEqualTo(blueView.CenterXAnchor)
        };
        //Must-fulfill
        foreach (var c in lightGreenConstraints) 
        {
            c.Priority = 1000;
        }
        NSLayoutConstraint.ActivateConstraints (lightGreenConstraints);

        //Low priority constraint to attempt to fill parent as much as possible (but lower priority than previous)
        var lightGreenLowPriorityConstraints = new []
         {
            lightGreenView.WidthAnchor.ConstraintEqualTo(blueView.WidthAnchor),
            lightGreenView.HeightAnchor.ConstraintEqualTo(blueView.HeightAnchor)
        };
        //Lower priority
        foreach (var c in lightGreenLowPriorityConstraints) 
        {
            c.Priority = 750;
        }

        NSLayoutConstraint.ActivateConstraints (lightGreenLowPriorityConstraints);

        //Aspect-fit on the green view now
        greenView.TranslatesAutoresizingMaskIntoConstraints = false;
        var greenConstraints = new []
        {
            //Aspect ratio of 5:1
            NSLayoutConstraint.Create(greenView, NSLayoutAttribute.Height, NSLayoutRelation.Equal, greenView, NSLayoutAttribute.Width, (nfloat) 5.0, 0),
            //Cannot be larger than parent's width or height
            greenView.WidthAnchor.ConstraintLessThanOrEqualTo(pinkView.WidthAnchor),
            greenView.HeightAnchor.ConstraintLessThanOrEqualTo(pinkView.HeightAnchor),
            //Center in parent
            greenView.CenterXAnchor.ConstraintEqualTo(pinkView.CenterXAnchor),
            greenView.CenterYAnchor.ConstraintEqualTo(pinkView.CenterYAnchor)
        };
        //Must fulfill
        foreach (var c in greenConstraints) 
        {
            c.Priority = 1000;
        }
        NSLayoutConstraint.ActivateConstraints (greenConstraints);

        //Low priority constraint to attempt to fill parent as much as possible (but lower priority than previous)
        var greenLowPriorityConstraints = new []
        {
            greenView.WidthAnchor.ConstraintEqualTo(pinkView.WidthAnchor),
            greenView.HeightAnchor.ConstraintEqualTo(pinkView.HeightAnchor)
        };
        //Lower-priority than above
        foreach (var c in greenLowPriorityConstraints) 
        {
            c.Priority = 750;
        }

        NSLayoutConstraint.ActivateConstraints (greenLowPriorityConstraints);

        this.View = view;

        view.LayoutIfNeeded ();
    }
}

1

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

typedef NS_ENUM(NSInteger, ContentMode) {
    ContentMode_aspectFit,
    ContentMode_aspectFill,
    ContentMode_stretch
}

// ....

[containerView addSubview:subview];

[subview mas_makeConstraints:^(MASConstraintMaker *make) {
    if (contentMode == ContentMode_stretch) {
        make.edges.equalTo(containerView);
    }
    else {
        make.center.equalTo(containerView);
        make.edges.equalTo(containerView).priorityHigh();
        make.width.equalTo(content.mas_height).multipliedBy(4.0 / 3); // the aspect ratio
        if (contentMode == ContentMode_aspectFit) {
            make.width.height.lessThanOrEqualTo(containerView);
        }
        else { // contentMode == ContentMode_aspectFill
            make.width.height.greaterThanOrEqualTo(containerView);
        }
    }
}];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.