স্টোরিবোর্ডে কাস্টম সেল রো উচ্চতা সেটিংস সাড়া দিচ্ছে না


213

আমি আমার টেবিল ভিউতে যে কোনও একটির জন্য ঘরের উচ্চতা সামঞ্জস্য করার চেষ্টা করছি। আমি প্রশ্নযুক্ত কক্ষের "আকার পরিদর্শক" এর ভিতরে "সারি উচ্চতা" সেটিংস থেকে আকারটি সামঞ্জস্য করছি। আমি যখন আমার আইফোনটিতে অ্যাপটি চালনা করি তখন সারণির ভিউতে "সারি আকার" থেকে কক্ষের ডিফল্ট আকার সেট থাকে।

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

উত্তর:


295

উপর গতিশীল কোষ, rowHeightUITableView উপর সেট সবসময় পৃথক সেলের rowHeight ওভাররাইড করে।

তবে স্ট্যাটিক সেলগুলিতে, rowHeightপৃথক কক্ষগুলিতে সেট করা ইউআইটিবেবলিউভকে ওভাররাইড করতে পারে।

এটি কোনও বাগ কিনা নিশ্চিত না, অ্যাপল সম্ভবত ইচ্ছাকৃতভাবে এটি করছে?


36
ডান উত্তর # 3, এবং বিশেষত কারণ এই উত্তরটি ইন্টারফেস বিল্ডার / স্টোরিবোর্ডগুলিতে প্রযোজ্য। আপনি যদি আইবিতে ঘরটি নির্বাচন করেন , তবে আকার পরিদর্শক শীর্ষে (একটি "কাস্টম" চেকবক্স সহ) সারি উচ্চতা দেখায় , তবে আপনি যদি পুরো টেবিলের দৃশ্যটি নির্বাচন করেন তবে আকারের পরিদর্শক সেখানে শীর্ষেও সারি উচ্চতা দেখায় (কোনও "কাস্টম নেই" " এক্ষেত্রে). পিক্সেলফ্রেইক যেমন বলেছেন, কেবলমাত্র টেবিল ভিউ সেটিংটি গতিশীল কক্ষগুলির জন্য ব্যবহৃত হয়। (এটি ইচ্ছাকৃত কিনা তা নিশ্চিত নয়)
রোববার

8
এই উত্তরটি বোঝায় যে সমাধানটি কেবল UITableViewবিষয়বস্তু থেকে পরিবর্তন Dynamic Prototypesকরা Static Cells, আমি তা করেছিলাম এবং আমার পুরো প্রকল্পটি ফুঁসে উঠল .. প্রায় নিজেকে মেরে ফেলা হয়েছিল।
অ্যাবড

4
এই নম্বরটি পুনরুদ্ধার করার কোনও উপায় আছে কি? এটি গভীরভাবে খননের একমাত্র উপায় হ'ল স্টোরিবোর্ডে ডুব দেওয়া এবং সেখান থেকে এটিকে টানতে?
বিকলপস

এটি অবশ্যই কোনও ত্রুটি নয়, কারণ আপনার টেবিলটি ডায়নামিক, সুতরাং সিস্টেমটি কীভাবে জানতে পারে যে আপনি সেই সমস্ত কোষের প্রতিটি ব্যবহার করেছেন? এবং প্রতিটি প্রোটোটাইপ কতবার ব্যবহৃত হত।
ভিনসেন্ট বার্নিয়ার 16

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

84

আপনি যদি ইউআইটিএবল ভিউ কনট্রোলার ব্যবহার করেন তবে এই পদ্ধতিটি প্রয়োগ করুন:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

একটি সারির ফাংশনে আপনি উচ্চতা চয়ন করতে পারেন। উদাহরণ স্বরূপ,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
       return 100;
    } 
    else {
       return 60;
    }
}

এই উদাহরণটিতে প্রথম সারির উচ্চতা 100 পিক্সেল এবং অন্যগুলি 60 পিক্সেল।

আমি আশা করি এটি আপনাকে সহায়তা করতে পারে।


2
বাবার, সবসময়ই একটি করে উভয়কেই করতে হয় (কাস্টম পরীক্ষা করে স্টোরিবোর্ডে সারি উচ্চতা মান সম্পাদনা করুন এবং & উচ্চতাফরআউটইটেক্সপথটিতে এটি নির্দিষ্ট করুন)?
মারসিওকোকো

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

34

গতিশীল কক্ষগুলির জন্য, সর্বদা rowHeightসেট করা UITableViewপৃথক কোষগুলিকে ওভাররাইড করে rowHeight

এই আচরণটি হ'ল আইএমও, একটি বাগ। যে কোনও সময় আপনার UI দুটি স্থানে পরিচালনা করতে গেলে এটি ত্রুটি হওয়ার আশঙ্কা করে। উদাহরণস্বরূপ, আপনি যদি স্টোরিবোর্ডে আপনার ঘরের আকার পরিবর্তন করেন তবে আপনাকে সেগুলিও পরিবর্তন করতে হবে মনে রাখতে হবে heightForRowAtIndexPath:। যতক্ষণ না অ্যাপল বাগটি স্থির করে না দেয়, বর্তমানের সর্বোত্তম কাজটি ওভাররাইড করা heightForRowAtIndexPath:, তবে ম্যাজিক সংখ্যা ব্যবহার না করে উচ্চতা নির্ধারণ করার জন্য স্টোরিবোর্ড থেকে আসল প্রোটোটাইপ সেলগুলি ব্যবহার করুন । এখানে একটি উদাহরণ:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* In this example, there is a different cell for
       the top, middle and bottom rows of the tableView.
       Each type of cell has a different height.
       self.model contains the data for the tableview 
    */
    static NSString *CellIdentifier;
    if (indexPath.row == 0) 
        CellIdentifier = @"CellTop";
    else if (indexPath.row + 1 == [self.model count] )
        CellIdentifier = @"CellBottom";
    else
        CellIdentifier = @"CellMiddle";

    UITableViewCell *cell = 
              [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    return cell.bounds.size.height;
}

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


2
আমি ক্যাশে সহ পুরো কোড সহ একটি উত্তর পোস্ট করেছি; দেখতে stackoverflow.com/a/16881312/292166
JosephH

1
বাহ-বাহ-বাহ! আমি উত্তর upvated, কিন্তু সচেতন হতে হবে! @ ব্রেনান মন্তব্যগুলিতে বলেছিলেন যে এই পদ্ধতিটি কেবলমাত্র পারফরম্যান্সের জন্য শাস্তি দেয় না, এটি প্রতিটি পুনঃলোডে মেমরি ফাঁসের মতো কিছু বর্ধমান মেমরি বরাদ্দও দেয়! উপরে লেন্সোয়েটের কাজটি ব্যবহার করা দরকার! এই স্মৃতি ফাঁস ধরতে দিন কাটান!
স্কাইওয়ান্দের

সুইফটে কাজ করে না, কারণ সেল.বাউন্ডস.সাইজ.হাইট সর্বদা 0.0 প্রদান করে
কিং-উইজার্ড

1
সিস্টেমটি আপনার টেবিল ভিউ: উচ্চতার জন্যরোআউটআইডেক্সপথ পদ্ধতি বলেছিল সেই সময়ে কোষগুলি এখনও বিদ্যমান নেই don't আপনি যে ইনডেক্সপথটি আপনাকে দিয়ে গেছেন তা আপনার ডেটা মডেলটিতে সূচী তৈরি করতে এবং সেখানে কোন ধরণের ঘর ব্যবহার করা হবে তা দেখতে সক্ষম হবেন এবং তারপরে সেই ঘরের জন্য উচ্চতা গণনা করুন এবং এটি ফিরিয়ে আনতে পারবেন বলে মনে করা হচ্ছে। এটি সিস্টেমটি কোনও ঘর তৈরি করার আগে টেবিলের মধ্যে ঘরগুলি সজ্জিত করতে সক্ষম করে।
কিং-উইজার্ড

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

22

আমি কোডটি বিভিন্ন উত্তর / মন্তব্যগুলির ইঙ্গিতটিতে তৈরি করেছি যাতে এটি স্টোরিবোর্ডগুলির জন্য কাজ করে যা প্রোটোটাইপ সেল ব্যবহার করে।

এই কোড:

  • স্টোরবোর্ডের সুস্পষ্ট স্থান ব্যতীত অন্য কোথাও কোষের উচ্চতা সেট করার দরকার নেই
  • কর্মক্ষমতা কারণে উচ্চতা ক্যাশে
  • সদৃশ যুক্তি এড়াতে সূচক পাথের জন্য ঘর সনাক্তকারী পেতে একটি সাধারণ ফাংশন ব্যবহার করে

উত্তরবোট, ব্রেনান এবং লেন্সোয়েটকে ধন্যবাদ

- (NSString *)cellIdentifierForIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = nil;

    switch (indexPath.section)
    {
        case 0:
            cellIdentifier = @"ArtworkCell";
            break;
         <... and so on ...>
    }

    return cellIdentifier;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];
    static NSMutableDictionary *heightCache;
    if (!heightCache)
        heightCache = [[NSMutableDictionary alloc] init];
    NSNumber *cachedHeight = heightCache[cellIdentifier];
    if (cachedHeight)
        return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    <... configure cell as usual...>

আমি জানি এটি একটি পুরানো উত্তর, তবে অন্য কেউ কি দেখতে পান যে এটি একটি স্ট্যাকের ওভারফ্লোতে ফলাফল করে? যখন ভিউ লোড হয়, আমি ইউআইসেকশনরোডাটা রিফ্রেশউইথসেকশন: টেবিলভিউরউডাটা: যা টেবিল ভিউ: উচ্চতারূপআউট ইন্ডেক্সপ্যাথকে ডাকে: যা ডিউকিউরেউসিয়েবল উইলআইডিসিডিফায়ার বলে: যা [ইউআইসেকশনরোডাটা ...] ডাকে তাই আমার কাছে পুনরাবৃত্ত স্ট্যাক ওভারফ্লো হয়। আমি সত্যিই এই সমাধানটি ব্যবহার করতে চেয়েছিলাম, তবে এটি iOS7 এর সাথে কাজ করছে বলে মনে হয় না।
sbaker

সুইফটে কাজ করে না, কারণ সেল.বাউন্ডস.সাইজ.হাইট সর্বদা 0.0 প্রদান করে
কিং-উইজার্ড

সিস্টেমটি আপনার টেবিল ভিউ: উচ্চতার জন্যরোআউটআইডেক্সপথ পদ্ধতি বলেছিল সেই সময়ে কোষগুলি এখনও বিদ্যমান নেই don't আপনি যে ইনডেক্সপথটি আপনাকে দিয়ে গেছেন তা আপনার ডেটা মডেলটিতে সূচী তৈরি করতে এবং সেখানে কোন ধরণের ঘর ব্যবহার করা হবে তা দেখতে সক্ষম হবেন এবং তারপরে সেই ঘরের উচ্চতা গণনা করুন এবং এটি ফিরিয়ে আনতে পারবেন বলে মনে করা হচ্ছে। এটি সিস্টেমটি কোনও ঘর তৈরি করার আগে টেবিলের মধ্যে ঘরগুলি সজ্জিত করতে সক্ষম করে।
কিং-উইজার্ড

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

@ তুষার-বাঘ আমি দ্রুত চেষ্টা করে দেখিনি, তবে আমি আপনার মন্তব্যগুলি বুঝতে পারি না। আমি 'আমার নিজস্ব সেলফরআউটএন্টেক্সপথ পদ্ধতি' কল করি না এবং ইচ্ছাকৃতভাবে আমি এটি করি না। আমি আরও সচেতন যে কোষগুলি টাইম টেবিলের অস্তিত্বহীন: ভিউ: উচ্চতার জন্যরোআউট ইন্ডেক্সপথ বলা হয়, এটিই এই কোডের পুরো পয়েন্ট এবং কেন এটি একটি সেল পেতে ডেকিউরউইজেবলসেলউইথআইডেন্টিফায়ার ব্যবহার করে। এই উত্তর পোস্ট করা কোড কাজ করে। হয় সুইফটে অতিরিক্ত কিছু চলছে, সুইফ্ট রূপান্তরটিতে কিছু সঠিক নয় বা এই প্রশ্ন / উত্তর লক্ষ্যবস্তু করে অন্য কোনও সমস্যা সমাধানের চেষ্টা করছেন।
জোসেফ এইচ

19

এমন দুটি জায়গা রয়েছে যেখানে আপনাকে সারি উচ্চতায় পরিবর্তন করতে হবে, প্রথমে ঘরটি (আপনি ইতিমধ্যে এটি পরিবর্তন করেছেন) এবং এখন সারণী দেখুনটি নির্বাচন করুন এবং আকার পরিদর্শকটি পরীক্ষা করুন


টেবিলভিউতে (সেলভিউ নয়)> আকার পরিদর্শক ট্যাবে> সারি উচ্চতা
kমান কাজী

প্রতিবার আমি এই বিশদটি ভুলে গিয়ে আমাকে বাদাম চালায়। স্টোরবোর্ডগুলি ব্যবহার করার সময় কেন ঘর সামঞ্জস্য করে টেবিলভিউ স্বয়ংক্রিয়ভাবে আপডেট হয় না তা ধারণা নেই!
স্কুটার

11

আমি এটি একটি বাগ মনে করি।

ইউটিলিটি ইন্সপেক্টর দ্বারা নয় বরং স্টোরিবোর্ডের মাউস টেনে সরাসরি উচ্চতা সামঞ্জস্য করার চেষ্টা করুন।

আমি এই পদ্ধতিটি দিয়ে এই সমস্যার সমাধান করেছি।


10

আপনি যদি দ্রুত ব্যবহার করছেন তবে এটি ব্যবহার করুন। সারি উচ্চতা নির্বাচন করতে স্টোরিবোর্ড ব্যবহার করবেন না। প্রোগ্রামিয়ালি টেবিল সারি উচ্চতা এই মত সেট করুন,

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 || indexPath.row == 1{
        let cell = self.tableView.dequeueReusableCellWithIdentifier("section1", forIndexPath: indexPath) as! Section1TableViewCell
        self.tableView.rowHeight = 150
        cell.label1.text = "hiiiiii"
        cell.label2.text = "Huiiilllllll"
        return cell

    } else {

        let cell = self.tableView.dequeueReusableCellWithIdentifier("section2", forIndexPath: indexPath) as! Section2TableViewCell
        self.tableView.rowHeight = 60
        cell.label3.text = "llll"
        return cell
    }

}

এটি কাজ করে, তবে আরও সাধারণভাবে আপনি করতে পারেন:cell.sizeToFit(); self.tableView.rowHeight = cell.frame.height
অ্যান্ডি চৌ

7

নিম্নলিখিত লাইনের সাহায্যে স্টোরিবোর্ড থেকে আপনি ইউআইটিএবলভিউসেল এর উচ্চতা (ইউআইটিএলভিউ কনট্রোলার - স্ট্যাটিক কোষে) পেতে পারেন।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CGFloat height = [super tableView:tableView heightForRowAtIndexPath:indexPath];

    return height;
}

6

এক্সএমএল ভিউতে স্টোরিবোর্ডটি খুলুন এবং rowHeightপছন্দসই উপাদানটির বৈশিষ্ট্যটি সম্পাদনা করার চেষ্টা করুন ।

আমি যখন আমার প্রোটোটাইপযুক্ত সারিটির জন্য কাস্টম সারিহাইট সেট করার চেষ্টা করেছি তখন এটি আমার পক্ষে কাজ করেছিল। এটি পরিদর্শকের মাধ্যমে কাজ করছে না, তবে এক্সএমএলের মাধ্যমে এটি কাজ করে।


1
আমি ডান ক্লিক করেছি এবং "হিসাবে খুলুন" -> "উত্স কোড" নির্বাচন করেছি। সারিটি হাইট ইতিমধ্যে 120 এ সেট করা ছিল I আমি বিশ্বাস করি যে স্টোরিবোর্ডটিতে একটি বাগ রয়েছে এবং এটি কাস্টম সেলের উচ্চতা উপেক্ষা করে।
zirinisp

6

আপনি cellsএকটি কাস্টম দিয়ে প্রোটোটাইপ ব্যবহার করতে পারেন heightএবং তারপরে অনুরোধ করতে cellForRowAtIndexPath:এবং এটিতে ফিরে আসতে পারেন frame.height::।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView
                    cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

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

এখন পর্যন্ত সর্বোত্তম সমাধান
TheJeff

4

আপনি যদি স্থির সারি উচ্চতা নির্ধারণ করতে চান তবে আপনি এই জাতীয় কিছু করতে পারেন:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 120;
}

4

আমি সম্প্রতি এটি নিয়ে কুস্তি করেছি। আমার সমস্যাটি ছিল যে heightForRowAtIndexPath:পদ্ধতিটি ব্যবহার করে উপরের পোস্ট করা সমাধানগুলি সিমুলেটারে আইওএস 7.1 এর জন্য কাজ করবে তবে কেবল আইওএস 8.1 এ স্যুইচ করে ফলাফলগুলি পুরোপুরি স্ক্রু করে ফেলেছে।

আমি সেল্ফ-সাইজিং সেলগুলি সম্পর্কে আরও পড়তে শুরু করি (আইওএস 8 তে প্রবর্তিত, এখানে পড়ুন )। এটা স্পষ্ট ছিল যে UITableViewAutomaticDimensionআইওএস 8 এর ব্যবহারটি সাহায্য করবে 8 আমি সেই কৌশলটি ব্যবহার করার চেষ্টা করেছি এবং ব্যবহারটি heightForRowAtIndexPath:এবং ভয়েলা মুছে ফেলেছি , এটি এখন আইওএস 8-এ নিখুঁতভাবে কাজ করছে। কিন্তু তখন আইওএস 7 ছিল না। আমি কী করব? আমি heightForRowAtIndexPath:আইওএস 7 এর জন্য প্রয়োজন, আইওএস 8 এর জন্য নয়।

এখানে আমার সমাধান (ব্রেভিটির জন্য ছাঁটাই করা) যা উত্তরটি জোসেফ এইচ পোস্ট করেছেন তা থেকে নেওয়া হয়েছে:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 50.;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    // ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        return UITableViewAutomaticDimension;

    } else {
        NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
        static NSMutableDictionary *heightCache;
        if (!heightCache)
            heightCache = [[NSMutableDictionary alloc] init];
        NSNumber *cachedHeight = heightCache[cellIdentifier];
        if (cachedHeight)
            return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
    }
}

- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
    NSString * reuseIdentifier;
    switch (indexPath.row) {
        case 0:
            reuseIdentifier = EventTitleCellIdentifier;
            break;
        case 2:
            reuseIdentifier = EventDateTimeCellIdentifier;
            break;
        case 4:
            reuseIdentifier = EventContactsCellIdentifier;
            break;
        case 6:
            reuseIdentifier = EventLocationCellIdentifier;
            break;
        case 8:
            reuseIdentifier = NotesCellIdentifier;
            break;
        default:
            reuseIdentifier = SeparatorCellIdentifier;
            break;
    }

    return reuseIdentifier;
}

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO (@ "8.0") আসলে আমি ব্যবহার করছি এমন ম্যাক্রো সংজ্ঞাগুলির একটি সেট থেকে যা আমি কোথাও পেয়েছি (খুব সহায়ক)। তারা হিসাবে সংজ্ঞায়িত করা হয়:

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

2

এক্সকোড 9 এ সুইফট 4 ব্যবহার করে কাজ করার সময় একই সমস্যা দেখা দিয়েছে ।

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


1
হাই, দয়া করে আপনি এটি কিভাবে করলেন?
ব্যাক প্যাকার

আপনার কেবল ঘরের নীচে একটি সীমাবদ্ধ সেট যুক্ত করতে হবে।
জাস্টিন

যখন আমি এটি করি এবং কক্ষের উচ্চতার জন্য স্টোরিবোর্ডে "স্বয়ংক্রিয়" নির্বাচন করি, এটি স্টোরিবোর্ডে সমস্ত উচ্চতা 44 এ সেট করতে চায় যদিও এটি আমি চালানোর সময় সঠিক প্রদর্শিত হয়। আমি সঠিকভাবে প্রদর্শন করতে স্টোরিবোর্ডটি কীভাবে পেতে পারি?
ডেভিড

1

গতিশীল কক্ষগুলির জন্য, ইউআইটিএবলভিউতে সারিউইট সেট সর্বদা স্বতন্ত্র কোষগুলির সারিউইথ ওভাররাইড করে। সারিটির ভিতরে থাকা সামগ্রীটি কেবল গতিশীল উচ্চতা গণনা করুন।


0

একমাত্র আসল সমাধান আমি খুঁজে পেতে পারি এটি

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = ...; // Instantiate with a "common" method you'll use again in cellForRowAtIndexPath:
    return cell.frame.size.height;
}

এটি কাজ করে এবং কোনও স্টোরবোর্ডে ইতিমধ্যে যুক্তিটিকে নকল করে দিলে / কোনও ভয়ঙ্কর স্যুইচ না করার অনুমতি দেয়। পারফরম্যান্স সম্পর্কে নিশ্চিত নন তবে আমি অনুমান করি যে cellForRow:ইতিমধ্যে কোষটি ইতিমধ্যে উদ্ভাবিত হওয়ার সাথে সাথে পৌঁছেছে as অবশ্যই এখানে জামানত ক্ষতি হতে পারে, কিন্তু দেখে মনে হচ্ছে এটি এখানে আমার জন্য ভাল কাজ করে।

আমি এটি এখানে পোস্ট করেছি: https://devforums.apple.com/message/772464

সম্পাদনা: অর্টউইন জেন্টজ আমাকে মনে করিয়ে দিয়েছিল যে কেবল দৃশ্যমানগুলি নয়, কেবল টেলভিউয়ের সমস্ত কক্ষের heightForRowAtIndexPath:জন্যই ডাকা হবে । লজিক্যাল শোনায় যেহেতু ডান স্ক্রোলবারগুলি দেখানোর জন্য আইওএসকে মোট উচ্চতা জানতে হবে। এর অর্থ এটি ছোট টেবিলভিউগুলিতে (২০ টি ঘর যেমন) খুব ভাল তবে 1000 সেলের টেলভিউতে এটি ভুলে যাবেন।

এছাড়াও, এক্সএমএল সহ পূর্ববর্তী কৌশল: আমার জন্য প্রথম মন্তব্য হিসাবে একই। সঠিক মানটি ইতিমধ্যে সেখানে ছিল।


0

মন্তব্য হিসাবে যুক্ত হয়েছে, তবে দৃশ্যমানতার জন্য উত্তর হিসাবে পোস্ট করা হয়েছে:

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


0

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

    import UIKit

    enum SignInUpMenuTableViewControllerCellIdentifier: String {
       case BigButtonCell = "BigButtonCell"
       case LabelCell = "LabelCell"
    }

    class SignInUpMenuTableViewController: UITableViewController {
            let heightCache = [SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell : CGFloat(50),
                              SignInUpMenuTableViewControllerCellIdentifier.LabelCell : CGFloat(115)]

    private func cellIdentifierForIndexPath(indexPath: NSIndexPath) -> SignInUpMenuTableViewControllerCellIdentifier {
        if indexPath.row == 2 {
            return SignInUpMenuTableViewControllerCellIdentifier.LabelCell
        } else {
            return SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell
        }
    }

   override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
       return self.heightCache[self.cellIdentifierForIndexPath(indexPath)]!
   }

   ...

  }

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

0

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

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