ইউআইটিএবলভিউসেলের আইওএস 7 এ অটো লেআউটটি সীমাবদ্ধ করে


104

আমি আমার কাস্টম ইউআইটিএবলভিউ সেলগুলি বিন্যাস করতে প্রোগ্রামিয়ালি স্বয়ংক্রিয় বিন্যাসের সীমাবদ্ধতাগুলি ব্যবহার করছি এবং আমি সেল আকারগুলি সঠিকভাবে সংজ্ঞায়িত করছি tableView:heightForRowAtIndexPath:

এটি iOS6 এ ঠিকঠাকভাবে কাজ করছে এবং এটি দেখতেও দুর্দান্ত পাশাপাশি সহ iOS7 জরিমানা

কিন্তু আমি যখন iOS7 এ অ্যাপটি চালাচ্ছি, কনসোলে আমি যে ধরণের বার্তা দেখি তা এখানে:

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
        "<NSLayoutConstraint:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50]   (Names: '|':UITableViewCellContentView:0xd93e850 )>",
        "<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
        "<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
        "<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
        "<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-|   (Names: '|':UITableViewCellContentView:0xd93e850 )>",
        "<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>

এবং প্রকৃতপক্ষে সেই তালিকার একটি বাধা আছে যা আমি চাই না:

"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"

এবং আমি এর translatesAutoresizingMaskIntoConstraintsসম্পত্তি সেট করতে পারি নাcontentView NO => এ এটি পুরো ঘরটি গোলমেলে করবে।

44 ডিফল্ট কক্ষের উচ্চতা তবে আমি টেবিল ভিউ প্রতিনিধিতে আমার কাস্টম হাইটগুলি সংজ্ঞায়িত করেছি তাই কেন সেল কন্টেন্টভিউতে এই সীমাবদ্ধতা রয়েছে? এর কারণ কী হতে পারে?

IOS6 এ এটি হচ্ছে না এবং iOS6 এবং iOS7 উভয়ই ঠিক দেখায় fine

আমার কোডটি বেশ বড় তাই আমি এটি এখানে পোস্ট করব না তবে যদি আপনার প্রয়োজন হয় তবে একটি পেস্টবিনের জন্য নির্দ্বিধায় জিজ্ঞাসা করুন।

সেল ইন্টেরালাইজেশনে আমি কীভাবে এটি করছি তা নির্দিষ্ট করতে:

  • আমি আমার সমস্ত লেবেল, বোতাম ইত্যাদি তৈরি করি
  • আমি তাদের translatesAutoresizingMaskIntoConstraintsসম্পত্তি NO সেট
  • আমি সেগুলিকে contentViewঘরের সাবভিউ হিসাবে যুক্ত করব
  • আমি সীমাবদ্ধতা যুক্ত contentView

আমি কেবল আইওএস 7-তে কেন এটি বুঝতে আগ্রহী।


আপনার কাস্টম সেল উচ্চতা সেট করা হয়?
মাইক পোলার্ড

আমার কাস্টম সেলের উচ্চতা 90 এ সেট করা হয়েছে
অ্যালেক্সিস

গতকাল একই সহকর্মীর একই সমস্যা ছিল, তবে ডিফল্ট প্রস্থটি 320 (একটি আইপ্যাড অ্যাপের জন্য) রয়েছে।
jrturton

এখানে এই একই সমস্যাটি দেখানোর জন্য একটি নমুনা প্রকল্প রয়েছে: github.com/Alex311/TableCellWithAutoLayout এটি সম্পর্কে আমার পর্যবেক্ষণগুলির কিছু এখানে রয়েছে: github.com/Alex311/TableCellWithAutoLayout/commit/…
হাস্যময়বার্গ

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

উত্তর:


132

আমারও এই সমস্যা ছিল ... এটি উপস্থিত হয় কনটেন্টভিউয়ের ফ্রেমটি layoutSubviewsকনটেন্টভিউয়ের ফ্রেমকে সেট করে রেখে আগে না বলা পর্যন্ত কনটেন্টভিউয়ের ফ্রেম আপডেট হয় না {0, 0, 320, 44} সীমাবদ্ধতাগুলি মূল্যায়ন করার সময়

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

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

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
    if (self)
    {
        self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
        [self loadViews];
        [self constrainViews];
    }
    return self;
}

এই কাজ মানুষ ধন্যবাদ। সম্পাদনার শৈলী ব্যবহার করার সময় কী ঘটতে পারে?
অ্যালেক্সিস

11
@ L14M333 আমি এখানে এই মন্তব্যে পোস্ট করা কোডটি দেখুন - মূলত, self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);আপনার সীমাবদ্ধতা যুক্ত করার আগে আপনাকে কেবল সেট করতে সক্ষম হওয়া উচিত যা সমস্যার সমাধান করবে।
স্মাইলিবার্গ

2
অটোরাইজিংমাস্ক আমার পক্ষে কাজ করে না: প্রাথমিক সীমাবদ্ধতা চলে গেছে তবে 3 টি নতুন যুক্ত করা হয়েছে "<এনএসআউটোরাইজিংমাস্কলয়েটকন্ট্রেন্ট: 0x8b79740 এইচ = - & - ভি = - & - ইউআইটিএবলভিউচেলকন্টিভিউ: 0x8b44010.height == UITableViewCeC> >30ViewCell> "<এনএসআউটোরাইজিংম্যাসক্ল্যাআউটআউটকন্ট্রাইন্ট: 0x8b7b9f0 এইচ = - এবং - ভি = - এবং - ইউআইটিএবল ভিউসেলসক্রোলভিউ: 0x8b4a130.height == লাইব্রেরি সেল: 0x8ac19d0.height>", "এনএসআউটসাইজিংয়েসক্লাইট্রাক্সিং & এক্সট্রাক্টিং -8 0x8ac19d0 (0)]> "
ক্যাটালফেটামিন

1
আমার জন্যও কাজ করে, আমি এক ঘন্টা এর মতো লড়াই করে যাচ্ছি! ধন্যবাদ! <3
মোকাগিও

2
অন্যান্য অটো লেআউট সমস্যা (আইওএস 7 / আইওএস 8) থেকে মুক্তি পাওয়ার পরে আমি জানতে পেরেছি যে ব্যবহার করা self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);যেমন ব্যবহারের মতো কাজ করে তেমনি কাজ করে self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;। আমি updateConstraintsআমার কন্টেন্ট ভিউতে সীমাবদ্ধতা যুক্ত করার আগে এটিকে রেখেছি।
পরীক্ষার

35

আইওএস 8 এসডিকে ব্যবহার করে আইওএস 7-তে ইউআইটিএবলভিউসেল এবং ইউআইসিএল্লিকেশনভিউসেল এর সাথে স্পষ্টতই কিছু সমস্যা আছে।

ঘরের পুনঃব্যবহার করা হলে আপনি সেলটির সামগ্রী ভিউ আপডেট করতে পারেন:

স্ট্যাটিক ইউআইটিএবল ভিউ কন্ট্রোলারের জন্য:

#ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1)
    {
        cell.contentView.frame = cell.bounds;
        cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin |UIViewAutoresizingFlexibleTopMargin |UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
    }

    //your code goes here

    return cell;
}

#endif
#endif

যেহেতু স্ট্যাটিক টেবিল ভিউ কন্ট্রোলারগুলি নাজুক এবং আপনি কিছু ডেটাসোর্স বা ডিলিটগেট পদ্ধতি প্রয়োগ করেন তবে সহজেই এটি ভেঙে যেতে পারে - এমন চেক রয়েছে যা নিশ্চিত করবে যে এই কোডটি কেবল iOS 7 এ সংকলিত হবে এবং চালিত হবে will

এটি স্ট্যান্ডার্ড ডায়নামিক ইউআইটিএবল ভিউ কনট্রোলারের জন্য সমান:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"CellID";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1)
    {
        cell.contentView.frame = cell.bounds;
        cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin |UIViewAutoresizingFlexibleTopMargin |UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin;
    }
    //your code goes here       
    return cell;
}

এই পদ্ধতির বাস্তবায়ন করা যেহেতু এই ক্ষেত্রে আমাদের সংকলন অতিরিক্ত চেকের প্রয়োজন নেই।

এই থ্রেড মন্তব্য মত ধারণা, উভয় ক্ষেত্রেই জন্য এবং UICollectionViewCell জন্য একই: স্টোরিবোর্ড প্রোটোটাইপ কক্ষে UICollectionViewCell contentView এর ফ্রেমের Autoresizing সমস্যা (Xcode 6, iOS 8 এ SDK এর) ঘটে যখন আইওএস 7 চলমান শুধুমাত্র


1
এটি সেরা উত্তর, বা আমার পক্ষে কমপক্ষে সেরা সমাধান। আমার সেল (অটোলেআউট বিধিগুলি) এক্সকোড 6 এর সাথে আইওএস 8 এ দুর্দান্ত কাজ করেছে এবং আইওএস 7 এবং এক্সকোড 5 এর সাথে 6 এর সাথে দুর্দান্ত কাজ করেছে I
xarly

এটি এখন Xcode 6.1 এর সাথে কোনও সমস্যা নয়। এছাড়াও, এনএসফাউন্ডেশন ভার্সন নাম্বার ব্যবহার করবেন না, দয়া করে দেখুন nshipster.com/swift-sism-version-checking
onwayway133

1
@ onmyway133: এক্সকোড 6.1 এ কেন এখন আর সমস্যা হচ্ছে না? আমি এক্সকোড 6.1 এবং আইওএস 8.1 এসডিকে ব্যবহার করেও আমার এখনও সমস্যা রয়েছে have সমস্যাটি কেবল আইওএস occurs এ ঘটে the সীমা পরিবর্তন করা বা একটি স্বয়ংক্রিয় আকারের মুখোশ সেট করা সমস্যার সমাধান করে। তবে আমি সবচেয়ে বেশি ভোট দেওয়া উত্তরে বা এর মন্তব্যে বর্ণিত পদ্ধতির ব্যবহার করেছি।
পরীক্ষার

হ্যাঁ আমার 3 ঘন্টা গোগলিংয়ের উপর ভিত্তি করে এটি সেরা উত্তর। অন্যান্য অনুরূপ "সমাধানগুলি" সেল কনটেন্টভিউ.আউটোরাইজিং ম্যাসকের সম্পূর্ণ তালিকা সরবরাহ করে না। কেবলমাত্র এটিই আমার আইপ্যাড 7.1 প্রকল্পের জন্য কাজ করে যা এক্সকোড 6-এ তৈরি হয়েছে
গোল্ডেন থাম্ব

13

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

আপনার ক্ষেত্রে ইউআইআইমেজভিউয়ের শীর্ষে 15-এর ফাঁক রয়েছে এবং নীচের দৃশ্যে নীচের দিকে 0 এর ফাঁক রয়েছে। আপনি যদি এই সীমাবদ্ধতার অগ্রাধিকারটি 999 এ স্থাপন করেন (1000 এর পরিবর্তে), অ্যাপ্লিকেশনটি ক্রাশ হবে না, কারণ সীমাবদ্ধতার প্রয়োজন নেই।

একবার লেআউটসুউভিউস পদ্ধতিটি কল করার পরে, কোষটির সঠিক উচ্চতা থাকবে এবং সীমাবদ্ধতাগুলি সাধারণত সন্তুষ্ট হতে পারে।


তুমি একজন প্রতিভাবান! সুন্দর এবং পরিষ্কার সমাধান আপনাকে ধন্যবাদ :)
ব্ল্যাক

9

আমি এখনও স্টোরিবোর্ডগুলির জন্য একটি ভাল সমাধান পাইনি ... কিছু তথ্য এখানেও: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188

তারা সেখানে যা পরামর্শ দেয় তা থেকে:

self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);

আমি আমার সমাধান প্ররোচিত করেছি:

  • স্টোরিবোর্ডে রাইট ক্লিক করুন
  • হিসাবে খুলুন -> উত্স কোড
  • "44" স্ট্রিংটি সেখানে সন্ধান করুন
  • এটা মত হতে হবে

<tableView hidden="YES" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" allowsSelection="NO" rowHeight="44" ...
    <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="ChatMessageCell" id="bCG-aU-ivE" customClass="ChatMessageCell">
        <rect key="frame" x="0.0" y="22" width="320" height="44"/>

  • সারি হাইট = "44" সাথে সারি হাইট = "9999" এবং উচ্চতা = "44" উচ্চতার সাথে = "9999" প্রতিস্থাপন করুন
  • স্টোরিবোর্ডে রাইট ক্লিক করুন
  • হিসাবে খুলুন -> ইন্টারফেস বিল্ডার
  • আপনার অ্যাপ্লিকেশন চালান এবং আউটপুট পরীক্ষা করুন

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

3

কেবলমাত্র ডিফল্ট কক্ষের উচ্চতা বৃদ্ধি করুন। সমস্যাটি দেখে মনে হচ্ছে কোষটির সামগ্রীটি ডিফল্ট (প্রাথমিক) কক্ষের আকারের চেয়ে বড়, কক্ষটিকে তার প্রকৃত আকারে পরিবর্তন না করা পর্যন্ত কিছু না-নেতিবাচক বাধা লঙ্ঘন করে।


প্রকৃতপক্ষে আমার ঘরগুলি ডিফল্ট আকারের চেয়ে লম্বা তবে কীভাবে ঘটে যায় যে টেবিলভিউয়ের প্রতিনিধি টেবিলভিউ প্রয়োগ করে: ডিফল্ট আকারটি ব্যবহার করা হয় তাই উচ্চতারোআউটআইডেক্সপথ:?
অ্যালেক্সিস

সম্ভবত কক্ষগুলি ডিফল্ট আকারের সাথে তৈরি করা হয় এবং তারপরে প্রকৃত আকারে পুনরায় আকার দেওয়া হয়।
ভাদিম ইয়েলগিন

প্রকৃতপক্ষে এটি কাজ করে, তবে কেন এটি iOS6 এ ঘটে না?
অ্যালেক্সিস

3
@ জাফর আইওএস 7 টি টেবিল ভিউ সেলগুলির আশেপাশে অনেক কিছু পরিবর্তন করেছে। আইওএস 7-এ, UITableViewCellScrollViewটেবিল ভিউ সেল এবং সামগ্রী ভিউয়ের মধ্যে এখন একটি স্ক্রোল ভিউ (টাইপ ) রয়েছে; এটি সম্ভবত iOS 6 এবং 7 এর মধ্যে পার্থক্য ব্যাখ্যা করে।
স্মাইলিবার্গ

3

হতে পারে ভিউটির অগ্রাধিকারটি 750 এর চেয়ে বড় এবং 1000 এরও কম সমাধান করতে পারে set

"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",

2

আমারও একই সমস্যা ছিল। আমার সমাধান উপরের অন্যদের উপর ভিত্তি করে:

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        // initialize my stuff
        [self layoutSubviews]; // avoid debugger warnings regarding constraint conflicts
    }
    return self;
}

সেরা, আলেসান্দ্রো


2
অ্যাপলের ডক্স থেকে:You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
রিকার্ডো সানচেজ-সায়েজ

আমি আপনার কাছে প্রার্থনা করে একটি ধর্ম শুরু করতে চাই। আমি এই সমস্যাটি সমাধানের চেষ্টা করার জন্য ঘন্টাগুলি অনুসন্ধান করছি এবং এটি সমাধান করে (পাশাপাশি বিষয়বস্তু.বাউন্ডগুলি সিজিআরেক্টমেককে সেট করে (0, 0, 99999, 99999;)) - এটি অ্যাপল কোডে একটি বাগ। সুতরাং, আমি শ্রদ্ধার সাথে আপেল ডক্সের সাথে একমত নই যে এই ফাংশনটিকে কল করবেন না। আপেল, আপনার বাজে কথা ঠিক করুন।
রায়ান কোপলি

0

আমিও এই সমস্যার মুখোমুখি হয়েছি এবং পরামর্শগুলির কোনওটিই সহায়তা করে নি। আমার ক্ষেত্রে আমার আকারের আকারের সেল রয়েছে এবং এতে ভিতরে ভিউ রয়েছে (প্রতিটি সংগ্রহ ভিউ সেলটিতে পূর্ণ আকারের চিত্র রয়েছে)। এখন, কক্ষের আকার উচ্চতা সংগ্রহ ভিউ (50) এর চেয়ে কিছুটা বড় (60) এবং এর ভিতরে থাকা চিত্রগুলি (50)। কারণ সেই সংগ্রহের কারণে ভিউ 10 টি 10 ​​মানের সাথে তদারকির সীমাবদ্ধতার নীচে প্রান্তিক করে রেখেছে That এই ক্ষেত্রেটি আমার কাছে একটি সতর্কতা এবং এটির সমাধানের একমাত্র উপায় ছিল ঘরের উচ্চতাটিকে তার সংগ্রহ ভিউয়ের মতো করে তোলা।


0

আমি ডিজাইনারটিতে ইউআইটিএবলভিউসেলকে মোটেও ব্যবহার না করে শেষ করেছি ... আমি সেখানে কাস্টম ভিউ তৈরি করেছি এবং এটিকে সেল প্রোগ্রামের মাধ্যমে কন্টেন্ট ভিউতে যুক্ত করছি ... কিছু সহায়তা বিভাগের সাথে কোনও কোড বয়লারপ্লেটও নেই ...


0

যদি এটি iOS8 এ কার্যকর হয়, এবং iOS7 এ সতর্কতাটি পেয়ে থাকে, আপনি স্টোরিবোর্ড উত্স কোডটি সন্ধান করতে পারেন এবং সঠিক টেবিলভিউকেলটি খুঁজে পেতে পারেন, তারপরে টেবিলভিউসেল লাইনের পরে রেকট বৈশিষ্ট্য যুক্ত করুন। ধন্যবাদ kuchumovn

<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" .../>
                                <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.