আমি রানটাইমে একটি নির্দিষ্ট সাবভিউয়ের জন্য অটোলেআউটটি অক্ষম করতে পারি?


104

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

সম্পূর্ণরূপে অটোলেআউট অক্ষম করা কিছুটা কঠোর বলে মনে হচ্ছে কারণ এটি অন্যান্য দর্শনগুলির জন্য লেআউট হ্যান্ডেল করার জন্য যুক্তিসঙ্গতভাবে ব্যবহৃত হতে পারে। দেখে মনে হচ্ছে যা আমি চাই তা কোনওরকম "নাল বাধা" const

উত্তর:


168

আমারও একই সমস্যা ছিল। তবে আমি এর সমাধান করেছি।
হ্যাঁ, আপনি UIViewএক্সকোড ৪.৩ এবং তারপরে ডিফল্টরূপে সেট করা পুরো এক্সিব বা স্টোরিবোর্ডের জন্য এটি নির্দিষ্ট সময়ের জন্য রানটাইমের সময় অটো লেআউটটি অক্ষম করতে পারেন ।

সেট translatesAutoresizingMaskIntoConstraintsথেকে YES, তার পরে আপনার subview ফ্রেম সেট করুন:

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);

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

@ মুহাম্মাদআমিরালি সাবউভিউ সরান এবং তারপরে যুক্ত করুন পারফরম্যান্স হ্রাস হতে পারে we আমরা কি আরও ভাল সমাধান সংরক্ষণাগারভুক্ত করতে পারি?
নাহাট দিনহ

2
@ দিনহনাট আমি উত্তরটি পরিষ্কার করে দিয়েছি। সাবউভিউ সরিয়ে এবং পুনরায় যুক্ত করা প্রয়োজন হয় না।
লেয়ান্ড্রোস

5
এটি আমাকে সতর্ক করে দেখায়: "একই সাথে সীমাবদ্ধতাগুলি পূরণ করতে অক্ষম।"
এনএসপ্রেটিক

1
আপনি আমার দিনটি বাঁচিয়েছেন ... অনুবাদ অটোরিজ়িংমাস্কিন্ট্র কন্ট্রেনট্রেটস
টিনটেনক্লেকস

50

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

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


1
স্ব.ব্যাভিগেশন আইটেম.টাইটেলভিউয়ের জন্য কাজ করে না। এখনও ফ্রেম পরিবর্তন সম্মান করে না।
হেনরিক এরল্যান্ডসন

1
যদি আপনি কোনও শিরোনাম দৃশ্যের ফ্রেমটি দিয়ে কৌতুক করার চেষ্টা করছেন, আমি এটিকে একটি ধারক দৃশ্যের ভিতরে রেখে the ন্যাভিগেশন আইটেমের কাস্টম ভিউ হিসাবে ধারক ভিউ যুক্ত করব।
jmstone617

2
এটি আমার পক্ষেও কাজ করেছিল। আমি এই কাজটি আবিষ্কার করার আগে প্রবাদবাদাম প্রাচীরের বিরুদ্ধে মাথা ঘুরিয়ে 2 ঘন্টা: 22 মি নষ্ট করব।
TMC

ধন্যবাদ মানুষ. আমি আমার দ্বিতীয় দিনের সাথে এই সমস্যাটির সাথে লড়াই করছি এবং এখন এটি কার্যকর হয়!
apostolov

28

সম্ভবত কেবল সেট translatesAutoresizingMaskIntoConstraintsকরা YES(এবং সেই দৃশ্যের উপরে প্রভাব ফেলতে অতিরিক্ত বাধা যুক্ত না করা) আপনাকে অটো লেআউট সিস্টেমের সাথে লড়াই না করে ফ্রেম সেট করতে দেবে।


17

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

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)

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

অথবা আপনি সরানকন্ট্রেন্টস এবং অ্যাডকন্ট্রেন্টস ব্যবহার করে সক্রিয় / নিষ্ক্রিয় করতে পারেন।


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

আচ্ছা আপনি আকারের ক্লাসগুলি ব্যবহার করে এটি করতে পারেন: বিকাশকারী.এপললল / লাইব্রেরি / আইস / রিসিপস / ,, তবে আমি এটি এইভাবে করতে পারিনি কারণ আমি আইওএস supporting সমর্থন করছি এবং আকারের ক্লাসগুলিও আইওএস 7 সমর্থন করে না আমি এটি বিরোধী প্রতিবন্ধকতার অগ্রাধিকার কমিয়ে দিয়েছি। আদর্শ নয়, তবে এটি সতর্কতা প্রতিরোধ করে। আমি মনে করি এটি যাইহোক আমি এটি করেছিলাম ....
বান্দেজপাটাইস

9

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

UIView + + DisableAutolayoutTemporarily.h

#import <UIKit/UIKit.h>

@interface UIView (DisableAutolayoutTemporarily)

// the view as a parameter is a convenience so we don't have to always
// guard against strong-reference cycles
- (void)resizeWithBlock:(void (^)(UIView *view))block;

@end

UIView + + DisableAutolayoutTemporarily.m

#import "UIView+DisableAutoResizeTemporarily.h"
@implementation UIView (DisableAutoResizeTemporarily)

- (void)resizeWithBlock:(void (^)(UIView * view))block
{
    UIView *superview = self.superview;
    [self removeFromSuperview];
    [self setTranslatesAutoresizingMaskIntoConstraints:YES];
    __weak UIView *weakSelf = self;
    block(weakSelf);
    [superview addSubview:self];
}

@end

আমি এটি এর মতো ব্যবহার করি:

[cell.argumentLabel resizeWithBlock:^(UIView *view) {
    [view setFrame:frame];
}];

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


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

6

আপনি xib / স্টোরিবোর্ডে ইউআইভিউর ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্যগুলিতে মান হ্যাঁ translatesAutoresizingMaskIntoConstraintsটাইপটি সেট Booleanকরতে পারেন।


2
  • 4.5 এ প্রজেক্ট খুলুন
  • স্টোরিবোর্ড নির্বাচন করুন
  • ফাইল ইন্সপেক্টর খুলুন
  • ইন্টারফেস বিল্ডার ডকুমেন্টের অধীনে 'অটোলেআউট ব্যবহার করুন' চেক করুন

আপনি যদি কিছু দেখার জন্য অটোলেআউট ব্যবহার করতে চান তবে আপনি একাধিক স্টোরিবোর্ড জুড়ে বিভক্ত করতে পারেন।


10
যা পুরো স্টোরিবোর্ড / নিব এর জন্য অটোলেআউট অক্ষম করে। যা আমি সন্ধান করছিলাম তা হ'ল উপায় (আদর্শভাবে প্রোগ্রামেটিক) স্টোরিবোর্ডের মধ্যে নির্দিষ্ট সাবভিউ / নিব অটোলেআউট ব্যবহার না করে স্টোরিবোর্ড / নিব নির্দিষ্ট করে যা কিছু রেখেছিল তা রেখে doing
ভয়ঙ্কর

আপনি একাধিক স্টোরিবোর্ড ব্যবহার করতে পারেন এবং প্রয়োজন অনুসারে কেবল অটোলেআউট / ছাড়াই এইগুলিকে আহ্বান করতে পারেন: // ইউএসটিরিবোর্ড * sb = [ইউআইসেটরিবোর্ড স্টোরিবোর্ড উইথনাম: @ "স্টোরিবোর্ড" বান্ডেল: [এনএসবান্ডেল মেইনবান্ডেল]]; বিস্তারিত ভিউকন্ট্রোলার * ডিভিকন্ট্রোলার = [এসবি ইনস্ট্যান্টিয়েট ভিউকন্ট্রোলারওথআইডিটিফায়ার: এন্ট্রি.ভিউনাম];
মাইক বববিট

1

আমার জন্য এটি প্রোগ্রামটিউমেটিকভাবে সাবউভি তৈরির জন্য কাজ করেছিল, আমার ক্ষেত্রে অটো লেআউটটি এমন একটি দৃষ্টিভঙ্গির সাথে জগাখিচুড়ি করছিল যা আমাকে এর কেন্দ্রের চারপাশে ঘোরানো দরকার তবে একবার আমি এই ভিউটি প্রোগ্রামিয়ালি তৈরি করলে এটি কাজ করে।


1

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

self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true

0

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

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

আমি ভাবছি যদি আপনি এমন কোনও ভিউ চান যা এটি সাধারণ আকার নয় যা উইন্ডোটি পূরণ করে তবে আপনার জন্য এটির জন্য একটি উপ ভিউ ব্যবহার করা উচিত।


0

আমি একটি অনুরূপ দৃশ্যের মুখোমুখি হয়েছি, যেখানে আমি এমন একটি প্রকল্পে যোগ দিয়েছি যা অটো-লেআউট দিয়ে শুরু হয়েছিল, তবে বেশ কয়েকটি দর্শনে আমার গতিশীল সামঞ্জস্য করা দরকার। আমার জন্য যা কাজ করেছে তা এখানে:

  1. ইন্টারফেস বিল্ডারে প্রদর্শিত বা উপাদানগুলি রাখবেন না।

  2. সম্পূর্ণরূপে আপনার ভিউগুলি বরাদ্দ / আরম্ভ দিয়ে শুরু করুন এবং তাদের ফ্রেমগুলি যথাযথভাবে সেট করুন।

  3. সম্পন্ন.


0

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

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

self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];

0

আপনারা যারা অটো লেআউট ব্যবহার করছেন তাদের জন্য দয়া করে আমার সমাধানটি এখানে দেখুন । আপনি @IBOutletসামঞ্জস্য করতে চান এমন প্রতিবন্ধকতাগুলির তৈরি করা উচিত এবং তারপরে তাদের ধ্রুবকগুলি পরিবর্তন করা উচিত।


-16

যদি এটি এক্সিব ফাইল হয়:

  1. .xib ফাইলটি নির্বাচন করুন
  2. "ফাইলের মালিক" নির্বাচন করুন
  3. ইউটিলিটিগুলি দেখান
  4. "ফাইল ইন্সপেক্টর" ক্লিক করুন
  5. "ইন্টারফেস বিল্ডার ডকুমেন্ট" এর অধীনে অক্ষম করুন: "অটোলেআউট ব্যবহার করুন"

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