[সম্পাদনা: সতর্কতা: পুরো আগত আলোচনাটি সম্ভবত iOS বা 8 দ্বারা কমপক্ষে ভারাক্রমে বা কমিয়ে দেওয়া হবে, যা ভিউ ট্রান্সফর্মটি প্রয়োগ করার সময় লেআউটটিকে ট্রিগার করার ভুল আর করতে পারে না]]
অটোলেআউট বনাম দেখুন রূপান্তর
অটোলেআউট দৃশ্য রূপান্তরগুলির সাথে মোটেও ভাল খেলছে না। কারণ হিসাবে আমি যতটা বুঝতে পারি, তা হ'ল আপনাকে এমন একটি দৃশ্যের ফ্রেমের সাথে গণ্ডগোল করার কথা নয় যা ট্রান্সফর্ম (ডিফল্ট পরিচয় রূপান্তর ছাড়া অন্য) - তবে এটি অটোলেআউট ঠিক ঠিক তাই করে। অটোলেআউট যেভাবে কাজ করে তা হ'ল layoutSubviews
রানটাইমে সমস্ত সীমাবদ্ধতার মধ্য দিয়ে ড্যাশিং আসে এবং ততক্ষণে সমস্ত দৃশ্যের ফ্রেম সেট করে।
অন্য কথায়, সীমাবদ্ধতা যাদু নয়; এগুলি কেবল একটি করণীয় তালিকা।layoutSubviews
করণীয় তালিকাটি সম্পন্ন হয়। এবং এটি ফ্রেম সেট করে এটি করে।
আমি বাগ হিসাবে এটি সম্পর্কিত সাহায্য করতে পারি না। যদি আমি এই ভিউটিতে এই রূপান্তরটি প্রয়োগ করি:
v.transform = CGAffineTransformMakeScale(0.5,0.5);
আমি পূর্বের মতো এবং অর্ধেক আকারের মতো একই জায়গায় তার কেন্দ্রের সাথে দৃশ্যটি প্রদর্শিত হবে বলে আশা করি। তবে এর সীমাবদ্ধতার উপর নির্ভর করে, আমি যা দেখছি তা নাও হতে পারে।
[আসলে, এখানে একটি দ্বিতীয় বিস্ময় রয়েছে: তাত্ক্ষণিকভাবে একটি ভিউ ট্রিগার লেআউটে রূপান্তর প্রয়োগ করা। এটি আমার কাছে অন্য একটি বাগ বলে মনে হচ্ছে। অথবা সম্ভবত এটি প্রথম বাগের হৃদয়। আমি যা প্রত্যাশা করব তা হ'ল কমপক্ষে বিন্যাসের সময় পর্যন্ত কোনও রূপান্তর নিয়ে পালাতে সক্ষম হবেন, উদাহরণস্বরূপ ডিভাইসটি ঘোরানো হয়েছে - ঠিক যেমন আমি বিন্যাসের সময় অবধি ফ্রেম অ্যানিমেশন দিয়ে দূরে যেতে পারি। তবে বাস্তবে বিন্যাসের সময়টি তাত্ক্ষণিক, যা কেবল ভুল বলে মনে হচ্ছে]]
সমাধান 1: কোনও সীমাবদ্ধতা নেই
একটি বর্তমান সমাধান হ'ল, যদি আমি কোনও দৃশ্যে একটি আধা-স্থায়ী রূপান্তর প্রয়োগ করতে যাচ্ছি (এবং কেবল এটি কোনওভাবে অস্থায়ীভাবে ছড়িয়ে দেব না), এটির প্রভাবিত সমস্ত বাধা অপসারণ করতে। দুর্ভাগ্যক্রমে এর ফলে পর্দা থেকে দৃশ্যটি বিলুপ্ত হয়ে যায়, যেহেতু অটোলেআউট এখনও ঘটে থাকে এবং এখন কোথায় ভিউটি রাখবেন তা আমাদের বলার কোনও বাধা নেই। তাই সীমাবদ্ধতাগুলি সরিয়ে দেওয়ার পাশাপাশি, আমি দর্শনটি translatesAutoresizingMaskIntoConstraints
হ্যাঁ হ্যাঁ সেট করে রেখেছি । দৃশ্যটি এখন পুরানো উপায়ে কাজ করে, কার্যকরভাবে অটোলেআউট দ্বারা প্রভাবিত। (এটা হয় স্বয়ংক্রিয়-বহির্বিন্যাস দ্বারা প্রভাবিত অবশ্যই, কিন্তু অন্তর্নিহিত autoresizing মাস্ক সীমাবদ্ধতার তার আচরণ ঠিক যেমন স্বয়ংক্রিয়-বহির্বিন্যাস সামনে হতে হতে।)
সমাধান 2: কেবলমাত্র উপযুক্ত সীমাবদ্ধতা ব্যবহার করুন
যদি এটি কিছুটা কঠোর মনে হয় তবে অন্য একটি সমাধান হ'ল উদ্দেশ্যযুক্ত ট্রান্সফর্মের সাহায্যে সঠিকভাবে কাজ করতে সীমাবদ্ধতাগুলি সেট করা। যদি কোনও ভিউর এর অভ্যন্তরীণ নির্দিষ্ট প্রস্থ এবং উচ্চতা অনুসারে খাঁটি আকার ধারণ করে এবং এর কেন্দ্রের দ্বারা খাঁটিভাবে স্থাপন করা হয়, উদাহরণস্বরূপ, আমার স্কেল ট্রান্সফর্মটি আমার প্রত্যাশা অনুযায়ী কাজ করবে। এই কোডটিতে, আমি একটি সংক্ষিপ্তসার ( otherView
) এর বিদ্যমান সীমাবদ্ধতাগুলি সরিয়ে ফেলি এবং এগুলি একটি নির্দিষ্ট প্রস্থ এবং উচ্চতা প্রদান করে এবং এর কেন্দ্রের দ্বারা খাঁটিভাবে পিন করে four চারটি সীমাবদ্ধতার সাথে তাদের প্রতিস্থাপন করি। এর পরে, আমার স্কেল রূপান্তর কাজ করে:
NSMutableArray* cons = [NSMutableArray array];
for (NSLayoutConstraint* con in self.view.constraints)
if (con.firstItem == self.otherView || con.secondItem == self.otherView)
[cons addObject:con];
[self.view removeConstraints:cons];
[self.otherView removeConstraints:self.otherView.constraints];
[self.view addConstraint:
[NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:self.otherView.center.x]];
[self.view addConstraint:
[NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:self.view attribute:NSLayoutAttributeTop multiplier:1 constant:self.otherView.center.y]];
[self.otherView addConstraint:
[NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:0 multiplier:1 constant:self.otherView.bounds.size.width]];
[self.otherView addConstraint:
[NSLayoutConstraint constraintWithItem:self.otherView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:0 multiplier:1 constant:self.otherView.bounds.size.height]];
আপশটটি হ'ল যদি আপনার কোনও বাধা যদি কোনও দৃশ্যের ফ্রেমকে প্রভাবিত করে তবে অটোলেআউট ভিউটির ফ্রেমটিকে স্পর্শ করবে না - যা রূপান্তর জড়িত থাকার পরে আপনি যা করছেন ঠিক সেটাই।
সমাধান 3: একটি সাবভিউ ব্যবহার করুন
উপরের উভয় সমাধানের সাথে সমস্যাটি হ'ল আমরা আমাদের দৃষ্টিভঙ্গি স্থাপনের ক্ষেত্রে সীমাবদ্ধতার সুবিধা হারাচ্ছি। সুতরাং এখানে একটি সমাধান যা সমাধান করে। একটি অদৃশ্য দৃশ্য দিয়ে শুরু করুন যার কাজটি কেবল একজন হোস্ট হিসাবে কাজ করা এবং এটির অবস্থানের জন্য সীমাবদ্ধতা ব্যবহার করুন। এর অভ্যন্তরে, আসল দৃষ্টিভঙ্গিটিকে একটি সংক্ষিপ্তসার হিসাবে রাখুন। হোস্ট ভিউয়ের মধ্যে সংক্ষিপ্তসারটি স্থাপন করতে সীমাবদ্ধতা ব্যবহার করুন, তবে আমরা যখন রূপান্তর প্রয়োগ করি তখন লড়াই করে না এমন সীমাবদ্ধতার মধ্যে সীমাবদ্ধ রাখুন।
এখানে একটি উদাহরণ দেওয়া আছে:
হোয়াইট ভিউ হোস্ট ভিউ; আপনি ভেবেছিলেন যে এটি স্বচ্ছ এবং অতএব অদৃশ্য। লাল দৃষ্টিভঙ্গিটি তার পর্যালোচনা, হোস্ট ভিউয়ের কেন্দ্রে এর কেন্দ্রটি পিন করে অবস্থিত by এখন আমরা কোনও সমস্যা ছাড়াই তার কেন্দ্রের চারপাশে লাল ভিউ স্কেল এবং ঘোরাইতে পারি এবং সত্যই চিত্রণটি দেখায় যে আমরা এটি করেছি:
self.otherView.transform = CGAffineTransformScale(self.otherView.transform, 0.5, 0.5);
self.otherView.transform = CGAffineTransformRotate(self.otherView.transform, M_PI/8.0);
এবং ইতিমধ্যে হোস্ট ভিউতে থাকা সীমাবদ্ধতাগুলি ডিভাইসটি ঘোরানোর সাথে সাথে এটি সঠিক জায়গায় রাখে।
সমাধান 4: পরিবর্তে স্তর পরিবর্তনগুলি ব্যবহার করুন
রূপান্তরগুলি দেখার পরিবর্তে, স্তর রূপান্তরগুলি ব্যবহার করুন, যা বিন্যাসকে ট্রিগার করে না এবং এই কারণে সীমাবদ্ধতার সাথে তাত্ক্ষণিক দ্বন্দ্ব সৃষ্টি করে না।
উদাহরণস্বরূপ, এই সাধারণ "থ্রোব" ভিউ অ্যানিমেশনটি অটোলেটের আওতায় ভালভাবে ভেঙে যেতে পারে:
[UIView animateWithDuration:0.3 delay:0
options:UIViewAnimationOptionAutoreverse
animations:^{
v.transform = CGAffineTransformMakeScale(1.1, 1.1);
} completion:^(BOOL finished) {
v.transform = CGAffineTransformIdentity;
}];
যদিও শেষ পর্যন্ত দৃশ্যের আকারে কোনও পরিবর্তন হয়নি, কেবল transform
কারণগুলির বিন্যাসটি ঘটতে কেবল সেট করা হয়েছে এবং সীমাবদ্ধতাগুলি ভিউটিকে চারপাশে ঝাঁপিয়ে তুলতে পারে। (এটি কি ত্রুটির মতো লাগে বা কী?) তবে আমরা যদি কোর অ্যানিমেশন (সিএবিসিক অ্যানিমেশন ব্যবহার করে এবং দৃশ্যের স্তরের সাথে অ্যানিমেশনটি প্রয়োগ করে) একই জিনিস করি তবে বিন্যাসটি ঘটে না এবং এটি সূক্ষ্মভাবে কাজ করে:
CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"transform"];
ba.autoreverses = YES;
ba.duration = 0.3;
ba.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1)];
[v.layer addAnimation:ba forKey:nil];
layerView
তার প্রস্থ জানেন? এটি কি তার ডান দিকটি অন্য কিছুর সাথে লেগে আছে?