একটি ইউআইটিএবলভিউসেলতে বিভাজক লাইনটি লুকান


250

আমি কাস্টমাইজ করছি UITableView । আমি শেষের দিকে আলাদা করে লাইনটি আড়াল করতে চাই কক্ষে ... আমি কি এটি করতে পারি?

আমি জানি আমি কি করতে পারি tableView.separatorStyle = UITableViewCellStyle.Noneকিন্তু যে প্রভাবিত করবে সব tableView কোষগুলোর। আমি এটি কেবল আমার শেষ কক্ষকে প্রভাবিত করতে চাই।



আপনার প্রশ্নের উত্তর আমার। টেবিলভিউ.স্যাপেটরস্টাইল = ইউআইটিএবল ভিউসেল স্টাইল.আমার যে লাইনের দরকার ছিল তা কোনও ছিল না
মালাচি হোল্ডেন

উত্তর:


371

ইন viewDidLoad, এই লাইন যুক্ত করুন:

self.tableView.separatorColor = [UIColor clearColor];

এবং ইন cellForRowAtIndexPath:

আইওএস লোয়ার সংস্করণগুলির জন্য

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

আইওএস 7 এর জন্য উচ্চতর সংস্করণ (আইওএস 8 সহ)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

4
এটি iOS7 এবং iOS8 এ কাজ করবে। এটি কার্যকরভাবে বিভাজককে শূন্যের নিচে ফেলে দেয়। সেল.সেসপেটরআইনসেট = ইউআইইডিজইনসেটস মেক (0, সিজিআরেক্টগেটউইথ (সেল.বাউন্ডস) / ২.০, ০, সিজিআরেক্টগেটউইথ (সেল.বাউন্ডস) / ২.০)
হ্যারিস

9
একটি অনুস্মারক: আপনার আইডিভাইসটি যখন আইপ্যাড হয় এবং সেল অটোলআউট ব্যবহার করা হয়, তখন "সেল.বাউন্ডস.সাইজ.উইথথ" দ্বারা প্রত্যাবর্তিত মান সম্ভবত আসল কক্ষের প্রস্থের সমান হয় না। তাই আমি সর্বদা "সেল.বাউন্ডস.সাইজ.উইথ" এর পরিবর্তে "টেবিলভিউ.ফ্রেম.সাইজ.উইথ" ব্যবহার করি।
ভাইট চু

5
দয়া করে নোট করুন: আপনার [cell.contentView addSubview:line]পরিবর্তে[cell addSubview:line]
আনাস্তাসিয়া

6
সেল.সেস্পেটর পরিবর্তন করুন ইনসেট বাম ইনসেটটি সেল সামগ্রীর বাম ইনসেটটিও পরিবর্তন করবে। শুধু বিভাজক লাইন নয়। আপেল ডক থেকে: "আপনি বর্তমানের ঘরের সামগ্রী এবং টেবিলের বাম এবং ডান প্রান্তগুলির মধ্যে স্থান যোগ করতে এই সম্পত্তিটি ব্যবহার করতে পারেন Pos ইতিবাচক ইনসেট মানগুলি ঘর সামগ্রী এবং ঘর বিভাজককে অভ্যন্তরে এবং সারণির প্রান্ত থেকে সরিয়ে নিয়ে যায়" "
zgjie

9
খারাপ ধারণা। আপনার কখনই কোনও ঘরে কোনও সংক্ষিপ্তসার যুক্ত করা উচিত নয় cellForRowAtIndexPath। মনে রাখবেন যে ঘরগুলি পুনরায় ব্যবহৃত হয়েছে। প্রতিবার এই ঘরটি পুনরায় ব্যবহার করা হলে আপনি অন্য বিভাজক লাইন ভিউ যুক্ত করবেন add বৃহত তালিকায় এটি স্ক্রোল কার্যকারিতা প্রভাবিত করতে পারে। এবং এটি করার সঠিক উপায় নয়।
ডেভ ব্যাটন

247

আপনি নিম্নলিখিত কোড ব্যবহার করতে পারেন:

সুইফট:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

বা:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

ডিফল্ট মার্জিনের জন্য:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

বিভাজককে শেষ-শেষ দেখানো

cell.separatorInset = .zero

উদ্দেশ্য গ:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}

গোষ্ঠীভুক্তদের পক্ষে কাজ করে না UITableView, যদিও গৃহীত উত্তর দেয়।
আলেক্স এন।

3
এটি iOS9 এর জন্য কাজ করে না, self.tableView.separatorColor = [UIColor clearColor];এটি স্থির করে।
বেন

1
এটি একটি সম্পূর্ণ হ্যাক তবে আইওএস 9 এ যা কাজ করে তা হ'ল: সেল.লেআউটমার্গিনস = ইউআইইডিজইনসেটস জিরো; সেল.স্যাপারেটরআইনসেট = ইউআইএডিজইনসেটস মেক (0, 0, 0, 9999)
প্যাট

আইওএস 8+ এ এটি আমার জন্য কাজ করে: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);আমি যদি সেল.লেআউটআমার্গিনস.ফেল্ট মানটি বিয়োগ না করি তবে বিভাজক রেখাটি বাম সীমানা থেকে বাম মার্জিনে টানা হবে (যদি আপনার কোনও থাকে)।
আলেকজান্দ্রে ওএস

3
এটি কোনও textLabelঅফ-স্ক্রিন ঠেলে দেয় ।
এহলকে

99

হিরেনের উত্তর অনুসরণ করতে ।

মধ্যে ViewDidLoad এবং নিম্নলিখিত লাইন:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

বা, আপনি যদি XIB বা স্টোরিবোর্ডগুলি ব্যবহার করছেন তবে " বিভাজক " কে " কোনও নয় " তে পরিবর্তন করুন :

ইন্টারফেস নির্মাতা

এবং সেলফরআরআউটআইডেক্সপথ এ এটি যুক্ত করুন:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

এখানে ফলাফলের উদাহরণ যেখানে আমি গতিশীল কক্ষগুলির সাথে একটি টেবিলভিউ প্রদর্শন করি (তবে কেবল সামগ্রীতে একটি একক আছে)। ফলাফলটি হ'ল কেবলমাত্র একজনের বিভাজক রয়েছে এবং সমস্ত "ডামি" টেবিলভিউ স্বয়ংক্রিয়ভাবে স্ক্রিনটি পূরণ করতে যোগ করে না।

এখানে চিত্র বর্ণনা লিখুন

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

সম্পাদনা: যাঁরা সবসময় মন্তব্য পড়েন না তাদের পক্ষে কয়েকটি লাইন কোডের সাহায্যে এটি করার আরও ভাল উপায় আছে:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}

আমি মনে করি, বিভাজক রেখাটি আড়াল করার জন্য এটি সঠিক পন্থা। self.tableView.separatorStyle = .None
arango_86

52

আপনি যদি নিজে বিভাজক আঁকতে না চান তবে এটি ব্যবহার করুন:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

যদিও এই আইপিএসটি আইওএস 7 থেকে শুরু হয়ে যায়।


8
separatorInsetসেল কন্টেন্ট পাশাপাশি cell.IndentationWidth = -10000;
বিভাজককে

23
separatorInsetশীর্ষ, বাম এবং নীচে এবং ডানদিকে ঘর প্রস্থের জন্য আরও ভাল পদ্ধতি সেট করা: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); এটি অন্য কোনও ঘর বৈশিষ্ট্য সামঞ্জস্য করার প্রয়োজন এড়ায়।
bryguy1300

আপনি যদি ইনসেটের জন্য ঘরের চৌকাঠগুলির প্রস্থ ব্যবহার করছেন তবে ইন্টারফেসটি ঘোরার সময় আপনাকে পুনরায় গণনার দরকার হতে পারে।
অ্যান্ড্রুআর

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

1
ইউআইএডিজইনসেটস মেক (0, 10000, 0, 0); কাজ করেছে -> ইউআইইডিজইনসেটস মেক (0, 0, 0, সেল.বাউন্ডস.সাইজ.উইথথ); না। অনুমান করুন যে কারণটি কারণেই আমার কাছে "" সাইজের ভিসিএসকে xibs এবং স্টাইরিবোর্ডে রাখার অভ্যাসের অভ্যাস আছে যা 4 "+ ডিভাইসে নিদর্শনগুলির ফলে 375-320px বিভাগ = 55px অবশেষ রয়েছে। (যোদা কণ্ঠে) এবং খুব কুরুচিপূর্ণ!
আন্তন ট্রপ্যাশকো

29

আমার বিকাশ পরিবেশ

  • এক্সকোড 7.0
  • 7 এ 220 সুইফট 2.0
  • আইওএস 9.0

উপরের উত্তরগুলি আমার জন্য পুরোপুরি কার্যকর হয় না

চেষ্টা করার পরে, আমার পরিশেষে কাজের সমাধানটি হ'ল:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

এবং প্রভাবটি হ'ল: এখানে চিত্র বর্ণনা লিখুন


20

separatorInset.right = .greatestFiniteMagnitudeআপনার কক্ষে সেট করুন।


এটিকে কল করার awakeFromNibফলে পুরো পর্দা ফ্ল্যাশ হতে পারেapplicationDidBecomeActive
ব্রেডবিন

এটি প্রোগ্রামেমেটিক ইউআইটিএবলভিউসেল তৈরি থেকে আইওএস 12.2, অন ডিভাইসে কাজ করে। খুশী হলাম।
Womble

ডাবল বিভাজক সেট করা আমার পক্ষে কাজ করেছিল যখন আমি এটি সেলফোর্ডআউটটিতে সেট করি। সেরা সমাধান। এটি আমার জন্য আইওএস 10 থেকে 13 পর্যন্ত কাজ করে। আইওএস 10, 12 ও 13 বাম মার্জিন তারপর সেট থাকে, তখন এটি iOS 10. জন্য কাজ হয়নি এমন পরিক্ষিত
এরিয়েল Bogdziewicz

18

ইন সুইফট 3, সুইফট 4 এবং সুইফট 5 , আপনি এটির মতো UITableViewCell একটি এক্সটেনশন লিখতে পারেন:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

তারপরে আপনি এটিকে নীচের হিসাবে ব্যবহার করতে পারেন (যখন সেলটি আপনার ঘরের উদাহরণ হয়):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

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


এটি গোষ্ঠীভিত্তিক ইউআইটিএবলভিউয়ের জন্য কাজ করে না। গোষ্ঠীযুক্ত মামলার সমাধান কি আপনার আছে?
zslavman

8

আইওএস 7 এবং 8 এর জন্য আরও ভাল সমাধান

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

যদি আপনার অ্যাপটি ঘূর্ণনযোগ্য হয় - বাম ইনসেট ধ্রুবকটির জন্য 3000.0f ব্যবহার করুন বা এটিকে ফ্লাইতে গণনা করুন। আপনি যদি ডান ইনসেট সেট করার চেষ্টা করেন তবে আইওএস 8-এ আপনার ঘরের বাম দিকে বিভাজকের দৃশ্যমান অংশ রয়েছে।


1
আপনি যখন এই জাতীয় কিছু করতে পারতেন তখন কেন এলোমেলো নম্বর ব্যবহার করবেন: ম্যাক্স ([[ইউআইস স্ক্রিন মেনস্ক্রিন] সীমানা]। সাইজ.উইথ, [[ইউআইস্ক্রিন মেনস্ক্রিন] সীমানা]। সাইজ.হাইট)); এটি সর্বদা চলে গেছে তা নিশ্চিত করতে
ড্যানিয়েল গালাসকো

7

আইওএস 7-এ, ইউআইটিএবল ভিউ গ্রুপবদ্ধ স্টাইলের ঘর বিভাজককে কিছুটা আলাদা দেখায়। এটি দেখতে কিছুটা এ জাতীয় দেখাচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আমি এই করার জন্য কমেনার এর উত্তর চেষ্টা করেছি :

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

তবে এটি আমার পক্ষে কাজ করে না বলে মনে হচ্ছে। আমি নিশ্চিত না কেন। তাই আমি হিরেনের উত্তরটি ব্যবহার করার সিদ্ধান্ত নিয়েছি , তবে ব্যবহার করছিUIView পরিবর্তে করে UIImageViewএবং আইওএস 7 স্টাইলে রেখাটি আঁকছি:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

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


7

আপনার ইউআইটিএবলভিউসেল সাবক্লাসে, লেআউটসুভিউগুলিকে ওভাররাইড করুন এবং _ইউআইটিএবল ভিউসেলসপেটরভিউ লুকান। আইওএস 10 এর অধীনে কাজ করে।

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}

উপরের সমাধানগুলির কোনওটিই কাজ করেনি, এটি iOS 12-এ কাজ করে
আব্দুল ওয়াহেদ

ব্যক্তিগত অ্যাপ্লিকেশনগুলি অ্যাক্সেস করার জন্য এটি অ্যাপ স্টোর থেকে প্রত্যাখ্যান হতে পারে।
এলিয়ট ফিস্কে

5

আমি বিশ্বাস করি না যে এই পদ্ধতিটি গতিশীল কোষগুলির সাথে যে কোনও পরিস্থিতিতে কাজ করবে ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

গতিশীল কোষগুলির জন্য আপনি যে টেবিলভিউ পদ্ধতিতে এটি করছেন তা বিবেচ্য নয় তবে যে ঘরে আপনি ইনসেট সম্পত্তি পরিবর্তন করেছেন সেটিতে সর্বদা নিখুঁতভাবে লাইন বিভাজককে ফাঁসানোর কারণ হিসাবে চিহ্নিত করা হবে এখনই সেট ইনপুট সম্পত্তি থাকবে ... এটি যতক্ষণ না আপনার নিজেই বদলাও

এরকম কিছু আমার জন্য কাজ করেছে:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

এইভাবে আপনি প্রতিটি লোডে আপনার ডেটা স্ট্রাকচারের স্থিতি আপডেট করেন


4

ইন সুইফট ব্যবহার আইওএস 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

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

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}

আমার প্রকল্পে, এটি স্ট্যাটিক সেলগুলির জন্য কাজ করে তবে গতিশীলদের জন্য নয়। পরবর্তী ক্ষেত্রে, শেষ কক্ষের সামগ্রীটি ডানে স্থানান্তরিত হয় (ঠিক বিভাজক রেখার মতো)। কোন ধারণা, কেন এটি হতে পারে?
বাস্তিয়ান

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

এটি পাঠ্য (শিরোনাম) স্থানান্তর করে, তাই অকেজো!
ব্যবহারকারী 155

4

এই সাবক্লাসটি ব্যবহার করুন, separatorInsetআইওএস 9.2.1 এর জন্য সেটটি কাজ করে না, সামগ্রীটি আটকানো হবে।

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9


4

আরও সহজ এবং যৌক্তিক হ'ল এটি করা:

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

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


1
স্ট্যাক ওভারফ্লোতে স্বাগতম! ভবিষ্যতের পাঠকদের জন্য একটি উত্তম উত্তরটি ব্যাখ্যা করবে যে এটি কেন সহজ এবং আরও যুক্তিসঙ্গত।
সিগ্রিটটন

একটি দুর্দান্ত সমাধান!
geek1706


3

সুইফট 3 ব্যবহার করে এবং দ্রুততম হ্যাকিং-পদ্ধতি অবলম্বন করে আপনি এক্সটেনশানগুলি ব্যবহার করে কোডটি উন্নত করতে পারেন :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

তারপরে, যখন আপনি ঘরটি কনফিগার করবেন:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

এটি অর্জনের সর্বোত্তম উপায় হ'ল ডিফল্ট লাইন বিভাজক, সাবক্লাস বন্ধ করে দেওয়া UITableViewCellএবং এর একটি সংক্ষিপ্তসার হিসাবে একটি কাস্টম লাইন বিভাজক যুক্ত করা contentView- একটি কাস্টম ঘর নীচে দেখুন SNStockযা দুটি স্ট্রিং বৈশিষ্ট্যযুক্ত টাইপের একটি অবজেক্ট উপস্থাপন করতে ব্যবহৃত হয় tickerএবং name:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

ডিফল্ট লাইন বিভাজক ব্যবহার অক্ষম করতে tableView.separatorStyle = UITableViewCellSeparatorStyle.None;,। গ্রাহক পক্ষ তুলনামূলকভাবে সহজ, নীচে উদাহরণ দেখুন:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}


2

যদি গৃহীত উত্তরটি কাজ না করে, আপনি এটি চেষ্টা করতে পারেন:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

এটা দুর্দান্ত;)


1

নীচের কোডটি চেষ্টা করুন, আপনার সমস্যা সমাধানে আপনাকে সহায়তা করতে পারে

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}

1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}

1

আপনাকে কাস্টম সেল নিতে হবে এবং লেবেল যুক্ত করতে হবে এবং লেবেলের মতো সীমাবদ্ধতা সেট করতে হবে পুরো ঘরের ক্ষেত্রফল coverেকে রাখা উচিত। এবং কনস্ট্রাক্টরের নীচে লাইন লিখুন।

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

নিম্নলিখিত হিসাবে ইউআইটিএবলভিউ লেআউট মার্জিন সেট করুন

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

নিম্নলিখিত ওয়ার্কআরউন্ডটি ব্যবহার না করে আমি একটি নির্দিষ্ট কক্ষে বিভাজকটি আড়াল করতে পারিনি

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}

1

আইওএস 7 এবং তারপরের জন্য, ক্লিনারটি হার্ডকোডযুক্ত মানের পরিবর্তে INFINITY ব্যবহার করা। স্ক্রিনটি ঘোরার সময় আপনাকে সেল আপডেট করার বিষয়ে চিন্তা করতে হবে না।

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}

3
সতর্কতা অবলম্বন করুন: INFINITY ব্যবহার করা iOS9
এন্ড্রুআর

1

যেমন (অনেক) নির্দেশ করেছেন, আপনি সমস্ত ইউআইটিএবলভিউসেল বিভাজককে কেবল পুরো ইউআইটিএবলভিউয়ের জন্য কেবল তাদের বন্ধ করে সহজেই লুকিয়ে রাখতে পারেন ; যেমন আপনার ইউআইটিএবলভিউ নিয়ন্ত্রণকারী ont

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

দুর্ভাগ্যক্রমে, প্রতি ঘরে ঘরে এটি করা একটি আসল পিআইটিএ ভিত্তিতে , যা আপনি সত্যিই জিজ্ঞাসা করছেন।

ব্যক্তিগতভাবে, আমি পরিবর্তন করার অসংখ্য অনুমতি চেষ্টা করেছি cell.separatorInset.left আবারও অনেকগুলি , যেমনটি (অনেকে) পরামর্শ দিয়েছেন, তবে সমস্যাটি হ'ল অ্যাপলকে উদ্ধৃত করা (জোর দেওয়া):

" ... আপনি বর্তমান কোষের মধ্যে স্থান যোগ করার জন্য এই সম্পত্তি ব্যবহার করতে পারেন বিষয়বস্তু এবং সারণির বাম এবং ডান প্রান্ত। ইতিবাচক আঁটা মান সরাতে সেল বিষয়বস্তু টেবিল প্রান্ত থেকে অভ্যন্তরস্থ এবং দূরে এবং সেল বিভাজক ... "

সুতরাং আপনি যদি বিভাজকটিকে ডানদিকে স্ক্রিনটি চেঁচিয়ে 'আড়াল করতে' চেষ্টা করেন তবে আপনি নিজের ঘরের কনটেন্ট ভিউতেও ইনডেন্টিং শেষ করতে পারেন। ক্রিফানের পরামর্শ অনুসারে, আপনি সেট করে cell.indentationWidthএবং এর মাধ্যমে এই বাজে পার্শ্ব-প্রতিক্রিয়ার জন্য ক্ষতিপূরণ দেওয়ার চেষ্টা করতে পারেনcell.indentationLevel সবকিছু ফিরিয়ে আনতে যথাযথভাবে , তবে এটি আমি অবিশ্বাস্যও পেয়েছি (সামগ্রীগুলি এখনও ইন্টেন্টেড হচ্ছে ...)।

আমি খুঁজে পেয়েছি সবচেয়ে নির্ভরযোগ্য উপায় হ'ল layoutSubviewsএকটি সাধারণ ইউআইটিএবলভিউসেল সাবক্লাসে ওভার রাইড করা এবং ডান ইনসেটটি সেট করা যাতে এটি বাম দিকের ইনসেটটি আঘাত করে, বিভাজকের 0 প্রস্থ এবং এত অদৃশ্য হয়ে যায় [এটি স্বয়ংক্রিয়ভাবে লেআউটে পর্যালোচনাগুলি করা দরকার হ্যান্ডেল রোটেশন]। এটি চালু করার জন্য আমি আমার সাবক্লাসে একটি সুবিধা পদ্ধতিও যুক্ত করি।

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

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


1

আমার প্রয়োজনটি ছিল চতুর্থ এবং 5 তম ঘরের মধ্যে বিভাজকটি লুকানো। আমি এটি দ্বারা অর্জন

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}

1

সুইফট:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

উদ্দেশ্য গ:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}

1

টেবিলভিউ সেল শ্রেণীর ভিতরে। কোডের এই লাইন রাখুন

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)

ডিভাইস / দৃশ্যের বিন্যাস পরিবর্তনের জন্য অ্যাকাউন্ট করে না।
Womble

0

আইওএস 9-তে আমার সমস্যা ছিল যে বিভাজনকারী পোকামাকড় পরিবর্তন করাও পাঠ্যের অবস্থান- এবং বিশদলাবেলের উপর প্রভাব ফেলে।

আমি এটি দিয়ে এটি সমাধান

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}

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