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


177

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

অন্য তারপর ব্যবহার করে UITableViewStyleGrouped, এটি করার কোনও উপায় আছে? আমি গোষ্ঠীভুক্ত ব্যবহার এড়াতে চাই কারণ এটি আমার সমস্ত কক্ষকে একটি মার্জিন যুক্ত করে এবং প্রতিটি কক্ষের জন্য পটভূমি দৃশ্যটি অক্ষম করা দরকার। আমি আমার লেআউটের পুরো নিয়ন্ত্রণ চাই। আদর্শভাবে তারা "UITableViewStyleBareBones" হবেন, তবে আমি ডকসগুলিতে সেই বিকল্পটি দেখতে পাই নি ...

অনেক ধন্যবাদ,



59
টেবিল শৈলী ইউআইটিএবলভিউ স্টাইলগ্রুপযুক্ত ব্যবহার করুন - যারা ভাসমান শিরোনাম অক্ষম করার জন্য সন্ধান করছেন এবং পুরো প্রশ্নটি পড়েন না তাদের জন্য এটিই উত্তর (এটি আমার কাছে হয়েছিল ...)।
গড় জো

@ কাস্তটান এটি একটি শূন্য লাইন সমাধান যা দুর্দান্ত কাজ করে! ধন্যবাদ।
লি ফ্যাস্তেনাও

উত্তর:


27

আপনার শিরোনাম সারিগুলি করার জন্য আপনার একটি কাস্টম সেল ব্যবহার করে এটি জাল করতে সক্ষম হওয়া উচিত। এর পরে সারণী দৃশ্যে অন্য যে কোনও কক্ষের মতো স্ক্রোল করবে।

cellForRowAtIndexPathশিরোনাম সারি হলে ডান ঘর প্রকারটি ফিরিয়ে আনতে আপনাকে কিছু যুক্তি যুক্ত করতে হবে।

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


11
হ্যাঁ ... যদিও এটি কিছুটা হ্যাক। এটি একটি অ্যাপল অংশ হিসাবে একটি পর্যবেক্ষণ বলে মনে হচ্ছে, কোডটি করার জন্য স্পষ্টভাবে কোড রয়েছে, আমাদের কেবল একটি পতাকা সেট করতে সক্ষম হওয়া দরকার need
কৌশলটি

2
কোনও বিশেষ হ্যাক ছাড়াই প্রভাব অর্জনের সঠিক উপায়ের জন্য নীচে আমার উত্তরটি যাচাই করুন, কেবলমাত্র প্রতিটি বিভাগের প্রথম সেলটিকে বিভাগের শিরোনাম হিসাবে পরিচালনা করুন!
সুমিত অনন্ত্বর

338

এটি অর্জনের সম্ভবত একটি সহজ উপায়:

উদ্দেশ্য গ:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

সুইফট:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

বিভাগের শিরোনামগুলি এখন কোনও নিয়মিত কক্ষের মতোই স্ক্রোল করবে।


5
এই friggin একটি কবজ মত কাজ !! সারণী শিরোনামের দর্শন শিরোনামের উপস্থিতি বিভাগের শিরোনামগুলি ভাসমান থেকে থামায়। এবং টেবিলের জন্য উপযুক্ত সামগ্রীর ইনসেটের সাথে একটি অদৃশ্য শিরোনাম কৌশলটি চালিয়ে যায় .. আপনাকে অনেক ধন্যবাদ! এই উত্তর কেন তেমন মনোযোগ পাচ্ছে না তা ভাবছেন
শ্যাম ভাট

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

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

5
আপনি এখনও সারণির হেডারের উচ্চতার সমান একটি সংখ্যা দ্বারা শীর্ষে শীর্ষের উচ্চতা বৃদ্ধি করে টেবিলের হাইডারভিউটি প্রদর্শন করতে পারেন এবং একই সংখ্যার সাহায্যে সামগ্রীটি হ্রাস করতে পারবেন।
শ্যাম ভাট

2
আমি আশা করি আমি এটিকে আবার উজ্জীবিত করতে পারব, আমি দৃ I'm়ভাবে নিশ্চিত যে এটি কমপক্ষে তৃতীয়বার এই প্রশ্নটি শেষ করেছি এবং এটি আমার সমস্যার সমাধান করেছে।
এল নিল

252

(ভুল টেবিল শৈলীর কারণে যারা এখানে এসেছেন তাদের জন্য) বৈশিষ্ট্য পরিদর্শকের মাধ্যমে বা কোডের মাধ্যমে টেবিল স্টাইলটি সমতল থেকে গোষ্ঠীভুক্ত করুন:

let tableView = UITableView(frame: .zero, style: .grouped)

3
আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ!
নিনজুদ

4
"অন্য তারপর ইউআইটিএবল ভিউ স্টাইলগ্রুপ ব্যবহার করে, কী এটি করার কোনও উপায় আছে?"
মাইকেল পিটারসন

27
ভাল জিনিস আমি সবচেয়ে উত্তোলিত উত্তর কার্যকর করার আগে সমস্ত উত্তরগুলি পরীক্ষা করতে শিখেছি :)
টুং ফ্যাম

1
এখন এই ছেলেরা, আপনি যে উত্তরটি খুঁজছিলেন তা কি। সচেতন হোন যে আপনি TableView Styleবৈশিষ্ট্যগুলিও ইনস্পেক্টরটিতে সম্পত্তিটি পেতে পারেন ।
ক্রিশ্চিয়ান হোল্ডুনু

4
প্রশ্নটিতে একটি উপায় সন্ধানের জন্য বিশেষভাবে উল্লেখ করা হয়েছে "অন্যথায় ইউআইটিবেলভিউ স্টাইলগ্রুপ ব্যবহার করা"
ফেরদজ

73

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

আমার ব্যক্তিগত ব্লগগুলিতে আমি বর্ণনা করেছি যেগুলি আমার ব্লগে ভাসমান বিভাগের শিরোনামগুলি ঘুরে

মূলত, আপনাকে কেবল সাবক্লাস করতে হবে UITableViewএবং NOএর দুটি পদ্ধতিতে ফিরে আসতে হবে :

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
কোনও উত্তর কেবল ডাউনওয়োটের যোগ্য নয় কারণ এটি প্রাইভেট এপিআইগুলি উল্লেখ করে (সকলেই অ্যাপস্টোরে জমা দেওয়ার জন্য কোড লিখছেন না)। উত্তরটি সঠিক হতে গেলে এটি দ্বিগুণ সত্য। সাবক্লাসিং (বা, আরও সহজেই, ইউআইটিএবল ভিউ বিভাগে তৈরি করা) যা এই পদ্ধতিগুলির জন্য কোনও উত্তর দেয় না শিরোনামগুলি ভাসমান থেকে থামায়। : যদি আপনি এই একটি পাবলিক এপিআই হিসেবে নিজেকে যুক্ত দেখতে চান তাহলে, একটি বাগ রিপোর্ট দায়ের দয়া bugreport.apple.com
jemmons

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

3
@ জেমস যদি আপনি না চান তবে আপনার উত্তরটি এটিকে "প্রাইভেট এপিআই ব্যবহৃত হয়েছে" হিসাবে চিহ্নিত করুন। অস্বীকৃতি বাছাই করুন :)
ক্যাস-কাদ

2
আপনার "আমার ব্লগ" লিঙ্কটি নষ্ট হয়েছে
মার্টিনমাইজার্ড

12
@ জেমস "অ্যাপ স্টোরে জমা দেওয়ার জন্য প্রত্যেকে কোড লিখছেন না" অ্যাপস্টোর আসলে সমস্যা নয়। সমস্যাটি হ'ল অ্যাপল যোগাযোগ বা অবমূল্যায়ন ছাড়াই ব্যক্তিগত এপিআইগুলিকে পরিবর্তন করতে পারে যা আপনার অ্যাপ্লিকেশনটিকে ভেঙে দেবে। অ্যাপল আপনাকে প্রত্যাখ্যান করার চেয়ে ব্যক্তিগত এপিআই কেন ব্যবহার করবেন না তার এটি আরও ভাল কারণ
অ্যারেক্সট

29

ঠিক আছে, আমি জানি এটি দেরী হয়ে গেছে তবে আমাকে এটি করতে হয়েছিল। আমি এখন কার্যক্ষম সমাধান অনুসন্ধান করে 10 ঘন্টা অতিবাহিত করেছি তবে পুরো উত্তর খুঁজে পাইনি। কিছু ইঙ্গিত পাওয়া গেছে তবে শুরুর পক্ষে বুঝতে অসুবিধা হয়েছে। সুতরাং আমাকে আমার 2 সেন্ট লাগাতে হবে এবং উত্তরটি সম্পূর্ণ করতে হবে।

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

সুতরাং, পদক্ষেপগুলি হয়।

  1. UITableViewStylePlain স্টাইল সহ UITableView প্রয়োগ করুন।

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. যথারীতি শিরোনামফোর্ডহাইডারইনসেকশনটি প্রয়োগ করুন (আপনি নিজের যুক্তি ব্যবহার করে এই মানটি পেতে পারেন তবে আমি আদর্শ প্রতিনিধিদের ব্যবহার করতে পছন্দ করি)।

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. যথারীতি ইমপ্লিমেন্ট নম্বর অফসেকশনসনটেবলভিউ

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. যথারীতি সংখ্যাঅফ্রাউসআইনসেকশনটি প্রয়োগ করুন।

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. উচ্চতারপরে 0.0f ফেরান

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. ভিউএফএইডারআইএনসেকশন বাস্তবায়ন করবেন না। শূন্য করার পরিবর্তে পদ্ধতিটি পুরোপুরি সরিয়ে ফেলুন।

  7. উচ্চতার জন্যরোআউটআইডেক্সপথ। (Indexpath.row == 0) কিনা পরীক্ষা করুন এবং বিভাগ শিরোনামের জন্য পছন্দসই ঘরের উচ্চতা ফিরিয়ে দিন, অন্যথায় ঘরের উচ্চতা ফিরিয়ে দিন।

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. এখন সেলফরআরএটিআইডেক্সপ্যাথে, (ইনডেক্সপথ.রো == 0) যাচাই করুন এবং সেকশনটি শিরোনামটি কোনওরূপে সেট না করে আপনি সেলটি প্রয়োগ করুন। আপনি যেমন সাধারণ কোষটি চান তেমনই ইএলএসই ঘরটি বাস্তবায়ন করুন।

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. এখন উইলসিলেকরোআউট ইন্ডেক্সপথ বাস্তবায়ন করুন এবং সূচিপথ.রো == ০. যদি ফিরে আসুন তবে এটি যত্নশীল হবে যে বিভাগটি শিরোনাম সারিটির জন্য কখনই নির্বাচন করেছেন সরু র্যাটআউট ইন্ডেক্সপথটি বরখাস্ত হয় না।

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. এবং অবশেষে didSelectRowAtIndexPath- এ, (indexpath.row! = 0) পরীক্ষা করুন এবং এগিয়ে যান।

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

এটি দিয়ে আপনি কাজ শেষ করেছেন। আপনার কাছে এখন পুরোপুরি স্ক্রোলিং, অ-ভাসমান বিভাগের শিরোনাম।


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

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

দুর্দান্ত উত্তর, তবে কেন 'যদি (indexPath.row! = 0)' চেক ইন 'করেছেন'ডলেস্টআরএটিআইডেক্সপথ'? এটি কি কেবল অতিরিক্ত সুরক্ষিত থাকতে হবে? আপনার 'উইলসিলিটারআউটইন্টেক্সপথ' প্রয়োগের সাথে সারিটি 0 টি হতে পারে না, তাই না?
Glenn85

1
@ Glenn85, দেরী জবাবের জন্য দুঃখিত। হ্যাঁ এটি কেবল একটি অতিরিক্ত সুরক্ষার জন্য।
সুমিত অনন্ত্বর

28

আপনার ইন্টারফেস বিল্ডারে আপনার সমস্যা সারণী দর্শনতে ক্লিক করুন

সমস্যা সারণী দেখুন

তারপরে অ্যাট্রিবিউটস ইন্সপেক্টর এ নেভিগেট করুন এবং স্টাইল প্লেইনকে দলবদ্ধ করুন;) সহজ করুন

সহজ


17

ইউআইটিএবলভিউ স্টাইলগ্রুপ সম্পর্কে আকর্ষণীয় বিষয় হ'ল টেবিলভিউটি টেবিলভিউতে নয় বরং কক্ষগুলিতে স্টাইল যুক্ত করে ।

শৈলীটি কোষগুলিতে ব্যাকগ্রাউন্ডভিউ হিসাবে যুক্ত করা হয় যা একটি ক্লাস হিসাবে ইউআইগ্রুপটিবেবল ভিউসেলব্যাকগ্রাউন্ড নামে থাকে যা বিভাগে ঘরের অবস্থান অনুযায়ী বিভিন্ন ব্যাকগ্রাউন্ড আঁকার পরিচালনা করে।

সুতরাং খুব সহজ সমাধানটি হ'ল ইউআইটিএবল ভিউ স্টাইলগ্রুপ ব্যবহার করা, টেবিলের ব্যাকগ্রাউন্ড কালার ক্লিয়ার কালারে সেট করা, এবং কেবলমাত্র সেলফোর্বের সেলটির ব্যাকগ্রাউন্ডভিউ প্রতিস্থাপন:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1
এটি শীর্ষ উত্তর হওয়া উচিত। এটি সম্পর্কে এখানে একটি ব্লগ পোস্ট রয়েছে: কোরকোকোয়া.ওয়ার্ডপ্রেস.কম
স্যাম

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

2
কক্ষগুলির সামগ্রীর দৃশ্যটি এখনও ডানদিকে স্থানান্তরিত হবে না?
পাইওটার টমাসিক

15

আপনার টেবিল ভিউ স্টাইলটি পরিবর্তন করুন:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

ইউআইটিবেল ভিউয়ের জন্য অ্যাপল ডকুমেন্টেশন অনুসারে:

UITableViewStylePlain- একটি সরল সারণী দর্শন। যে কোনও বিভাগের শিরোনাম বা পাদচরণগুলি ইনলাইন বিভাজক হিসাবে প্রদর্শিত হবে এবং টেবিলের দৃশ্যটি স্ক্রোল করার সময় ভাসমান।

UITableViewStyleGrouped- একটি সারণী দর্শন যার বিভাগগুলি সারিগুলির পৃথক গোষ্ঠী উপস্থাপন করে। বিভাগের শিরোনাম এবং পাদচরণগুলি ভাসমান নয়।


5

আরও একটি জটিল উপায় আছে। মূল ধারণাটি হ'ল বিভাগ সংখ্যাটি দ্বিগুণ করা, এবং প্রথমটি কেবলমাত্র হেডারভিউ দেখায় যখন দ্বিতীয়টি আসল ঘরগুলি দেখায়।

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

তারপরে যা করা দরকার তা হ'ল হেডার ইনসেকশন প্রতিনিধিদের বাস্তবায়ন করা:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

এই পদ্ধতির আপনার ডেটা সোর্সগুলিতে খুব কম প্রভাব পড়ে:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

অন্যান্য পদ্ধতির সাথে তুলনা করা, টেবিলভিউর ফ্রেম বা সামগ্রীবহির্ভূত পরিবর্তন না করার সময় এই উপায়টি নিরাপদ। আশা করি এটি সাহায্য করতে পারে।


5

আপনি যা চান তা পাওয়ার সহজতম উপায়টি হ'ল আপনার সারণী শৈলীটি যেমন UITableViewStyleGroupedবিভাজক শৈলী UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

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


4

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


ভালো বুদ্ধি. আমি এই হ্যাক ভালোবাসি।
স্টিভ মোসার 21

মজার মজার। ধারণাটির প্রশংসা করুন, তবে একটি হ্যাক হ্যাক। শিরোনামগুলি নীচে ভাসতে শুরু করবে সুতরাং সমস্যাটি সত্যিই সমাধান করবে না
শ্যাম ভাট

4

সুইফ্ট 3+ এর জন্য

কেবল UITableViewStyleGroupedনিম্নরূপে ফুটারের উচ্চতা শূন্যে সেট করুন এবং সেট করুন:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
আপনি 0 এর পরিবর্তে ফিরে আসতে পারেন .leastNormalMagnitude। এছাড়াও আপনার প্রয়োগ করতে হবেtableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
ইলিয়াস করিম

@ ইলিয়াসকারিম এটিকে 0 টির জন্য নির্ধারণ করে এটির শূন্য-উচ্চতা না থাকার জন্য ues এছাড়াও, viewForFooterInSectionএই ক্ষেত্রে ফাংশনটি বাস্তবায়নের প্রয়োজন হয় না ।
ট্যামস সেঞ্জেল

0এবং .leastNormalMagnitudeএকই প্রভাব ছিল। বাস্তবায়নকারী viewForFooterSectionপদ্ধতি প্রয়োজন। আপনার শূন্য করা উচিত। এটি এক্সকোড 11.3.1 এর সাথে সুইফ্ট 5.1 এ রয়েছে।
ইলিয়াস করিম

3

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

আমাদের টেবিলভিউ স্টাইলটি ইউআইটিএবল ভিউ স্টাইলগ্রুপে পরিবর্তন করুন সেলটি ফোরওয়ারের ঠিক আগে, নীচের লাইনটি সেলফোর্ডে যুক্ত করুন:

সেল.ব্যাকগ্রাউন্ডভিউ = [[[ইউআইভিউ বরাদ্দ] initWithFrame: সেল.বাউন্ডস] স্বতঃপরে]

এবং এটাই. টেবিলভিউ স্টাইলটি ভাসমান শিরোনাম ব্যতীত হুবহু ইউআইটিএবল ভিউ স্টাইলপ্লেইনের মতো হয়ে যাবে।

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


2

হতে পারে আপনি scrollViewDidScrollটেবিলভিউতে ব্যবহার করতে পারবেন এবং contentInsetবর্তমানের দৃশ্যমান শিরোনামের ভিত্তিতে পরিবর্তন করতে পারেন ।

এটা আমার ব্যবহারের ক্ষেত্রে কাজ করে বলে মনে হচ্ছে!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

1

এটি করার আরেকটি উপায় হ'ল আপনি যে শিরোনামটি চালু করতে চান তার ঠিক আগে খালি বিভাগ তৈরি করা এবং সেই শিরোনামটি আপনার শিরোনামকে দেওয়া উচিত। বিভাগটি খালি থাকায় শিরোনামটি সঙ্গে সঙ্গে স্ক্রোল করবে।


1

আপনি উপরে একটি বিভাগ (শূন্য সারি সহ) যুক্ত করতে পারেন, তারপরে উপরের বিভাগটি বর্তমান বিভাগের শিরোনাম দেখুন হিসাবে ফুটারভিউ সেট করুন, ফুটারভিউ ভাসমান নয়। আশা করি এটি একটি সহায়তা দেয়।


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

0

এক্সএকে উপেক্ষা করুন। আপনি যদি অ্যাপ্লিকেশনটিকে অ্যাপল দ্বারা গৃহীত হওয়ার সুযোগ পেতে চান তবে কোনও ব্যক্তিগত পদ্ধতি অন্বেষণ করবেন না।

আপনি যদি ইন্টারফেস বিল্ডার ব্যবহার করে থাকেন তবে এটি সবচেয়ে সহজ। আপনি দৃশ্যের শীর্ষে একটি ইউআইভিউ যুক্ত করবেন (যেখানে চিত্রগুলি যাবে), তারপরে তার টেবিলভিউটি যুক্ত করুন। আইবি অনুসারে এটি আকার করা উচিত; এটি হ'ল টেবিলভিউয়ের শীর্ষটি আপনি সবেমাত্র যুক্ত করা ইউআইভিউয়ের নীচে ছুঁয়েছে এবং এর উচ্চতাটি স্ক্রিনের বাকি অংশটি coversেকে ফেলেছে।

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

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


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

0

স্টোরিবোর্ডের সাথে শিরোনাম কীভাবে প্রয়োগ করতে হবে তার উত্তরটি পরীক্ষা করুন: স্টোরিবোর্ডে সারণী শিরোনামের দর্শন

আপনি যদি বাস্তবায়ন না করেন তবে এটিও লক্ষ্য করুন

viewForHeaderInSection:(NSInteger)section

এটি ভেসে উঠবে না যা আপনি চান ঠিক তাই।


0

সম্পূর্ণ ভাসমান বিভাগের শিরোনাম বিভাগগুলি সরাতে, আপনি এটি করতে পারেন:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil কাজ করে না

ভাসমান অক্ষম করতে তবে বিভাগের শিরোনামগুলি প্রদর্শন করতে আপনি তার নিজস্ব আচরণের সাথে একটি কাস্টম ভিউ সরবরাহ করতে পারেন।


0

@ সামওয়ারমেটের সমাধানের ক্ষেত্রে একটি প্রকরণ:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}

0

স্নিপেট কেবল প্রথম বিভাগের জন্য একটি স্টিকি হেডার প্রদর্শন করে। অন্য বিভাগের শিরোনামগুলি একটি কোষ সহ ভেসে উঠবে।

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}

-1

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

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

ব্যবহারকারী যখন স্ক্রোল করবেন তখন শিরোনামের দৃশ্যটি অদৃশ্য হয়ে যাবে। আমি জানি না কেন এটি এমনভাবে কাজ করে তবে মনে হয় আপনি যা করছেন তা অর্জন করবে achieve


এটি কোনও বিভাগের জন্য নয়, এটি শীর্ষে 1 টি শিরোনামের জন্য।
মকদাদ

-1

হতে পারে আপনি কেবল শিরোনাম দর্শন পটভূমিকে স্বচ্ছ করতে পারেন:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

অথবা এটি বিশ্বব্যাপী প্রয়োগ করুন:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

অটোলেআউট ছাড়াই এবং XIB এর মাধ্যমে যা কিছু করা হয়েছে তার সাথে ব্যবহার করার জন্য আমার কাছে আরও একটি সহজ সমাধান রয়েছে:

1 / টেক্সটভিউতে আপনার শিরোনামটি টেবিলভিউতে সরাসরি টেনে এনে ফেলে Put

2 / নতুন তৈরি শিরোনামের আকার পরিদর্শকতে, কেবল এটির স্বয়ংক্রিয়করণ পরিবর্তন করুন: আপনার কেবল উপরের, বাম এবং ডান অ্যাঙ্কারগুলি ছেড়ে দিতে হবে, এবং ভরাটটি অনুভূমিকভাবে ছেড়ে দেওয়া উচিত।

শিরোনামের জন্য এটি সেট করা উচিত

কৌতুক করা উচিত!


-2

@ সামওয়ারমেটের উত্তর অনুসারে - কোডারদের সুইফ্টটি ব্যবহার করা সহজ করার জন্য আমি উপরের কোডটি সুইফটে প্রয়োগ করেছি।

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

-2

রেফ: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

PLUSE

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

এটি হেডার স্পেস ব্যবহার করতে সহায়তা করেছে to


দয়া করে, এটি করবেন না
মিউকোডার 20'19

-3

2020 সর্বশেষ আপডেট

এক্সকোড 14 দিয়ে পরীক্ষা করা হয়েছে।

যে কোনও বিভাগের শিরোনামটি আড়াল করার জন্য, বিভাগের প্রতিনিধি শিরোনামের জন্য শূন্য করুন

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}

-4

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


মূল পোস্টারটি কাস্টম শিরোনাম চায় না। তারা এমন একটি শিরোনাম চায় যা টেবিলের শীর্ষে "ভাসমান" না। আপনার পরামর্শটি এখনও ভাসমান।
জেমনস

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