ইউআইটিএবলভিউতে বিভাজনের সম্পূর্ণ প্রস্থ কীভাবে সেট করবেন


149

আমার এমন একটি রয়েছে UITableViewযেখানে পৃথককারীগুলির পুরো প্রস্থ নেই। এটি বাম পাশের আগে 10 পিক্সেলের মতো শেষ হয়। আমি এই কোডটি দিয়ে চারপাশে খেলছিলাম viewDidLoad()

self.tableView.layoutMargins = UIEdgeInsetsZero;

স্টোরিবোর্ডে যখন আপনি কাস্টম বা ডিফল্ট নির্বাচনকারী নির্বাচন করতে পারেন। এখন যে সমস্ত ঘরগুলি জনবহুল হয় সেগুলির পূর্ণ-প্রস্থ নির্বাচনকারী নেই তবে খালি খণ্ডগুলির পূর্ণ প্রস্থ রয়েছে।

আমি এটা কিভাবে ঠিক করবো?


9
UITableViewএকটি সম্পত্তি আছে separatorInsetUITableViewলাইন বিভাজকটির সূচনা শূন্যে সেট করুন । এছাড়াও আপনি separatorInsetস্টোরিবোর্ড থেকে পরিবর্তন করতে পারেন
KRUKUSA

উত্তর:


220

এটি আমার জন্য আইওএস 8.4 - 9.0 ডিভাইসে এক্সকোড 6.4 এবং সুইফট 1.2 ব্যবহার করে কাজ করেছে:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

সুইফট 5 আপডেট:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

এটি কেন আমার টেবিলটি ফাঁকা দিয়ে সরিয়ে ফেলবে? পৃথককারীদের সরানো হয়েছে তবে আমি আমার কোনও বোতাম দেখতে পাচ্ছি না
অস্কার

1
@ জেমস আপনি কি দয়া করে "একটি ফাঁকা দিয়ে আমার টেবিলটি সরিয়ে ফেলবেন?" ব্যাখ্যা করতে পারেন? কীভাবে আপনি আপনার বোতামগুলি যুক্ত করেছেন (আইবি, কোডের মাধ্যমে)?
এমবি_আইওএস ডেভেলপার

1
খুব সুন্দর সমাধান। তবে আমার ক্ষেত্রে আমি কোডটি সরাসরি সেল সূচনাতে রেখেছি, বীচুস আমি সমস্ত কন্ট্রোলারগুলিতে বিভাজকের পূর্ণ প্রস্থ থাকতে চাই।
ভোজটা

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

1
এর কোনও সমাধান আইপ্যাডে কাজ করে না। এটি কেবল একটি আইফোনেই কাজ করে ...
চার্লস রবার্টসন

103

আমি এই পোস্ট থেকে উত্তর পেয়েছি: iOS 8 UITableView বিভাজক ইনসেট 0 কাজ করছে না

আপনার এই কোডটি যুক্ত করুন UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

2
এটি আমার জন্য কেবল টেবিলভিউ প্রতিনিধি পদ্ধতি যুক্ত করার জন্য কাজ করে
টনিটনি

আমি দুঃখিত আমি নিচে না। আপনি বোঝাতে চেয়েছেন যে টেবিলভিউডেলিগেট যুক্ত করা আপনার পক্ষে যথেষ্ট ছিল? আমি কেবল এটি যোগ করার চেষ্টা করেছি যে এটি আমার পক্ষে কাজ করে না @ টনিটনি
টিমো

3
আমার জন্য পদ্ধতিটি viewDidLayoutSubviewsপ্রয়োজনীয় নয়
টনি টনি

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

আমি উভয় ব্যবহার করতে হবে। আমি সাফল্য ছাড়া প্রতিটি পৃথকভাবে ব্যবহার করার চেষ্টা করেছি। এটি তখনই কাজ করেছিল যখন আমি উভয় ব্যবহার করি। এছাড়াও, আমার ভিউ কন্ট্রোলার যখন ইউআইটিএবলভিউ কনট্রোলারের একটি সাবক্লাস ছিল এবং যখন এটি ইউআইভিউকন্ট্রোলারের একটি সাবক্লাস ছিল তখন আমি এটি চেষ্টা করেছিলাম। কোনও পার্থক্য নেই। নোট করুন যে আমি 8.1 সিমুলেটারে চালাচ্ছি।
রন

100

আপনার UITableViewCell

আপনার ইন্টারফেস বিল্ডারে অ্যাট্রিবিউট ইন্সপেক্টর এ যান এবং কেবল "15" থেকে 0 তে পরিবর্তন করুন। আপনি যে কক্ষগুলি পরিবর্তন করতে চান তার জন্য এটি করুন।

instets

আপনি যোগ করার প্রয়োজন হতে পারে [cell setLayoutMargins:UIEdgeInsetsZero];আপনারtableViewCell


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

আপনি যদি স্ট্যাটিক সেল ব্যবহার করে থাকেন তবে আপনার যা দরকার তা হ'ল বাম ইনসেটটি 0 তে পরিবর্তন করতে হবে যেমন চিত্রটিতে বর্ণিত হয়েছে (আইওএস 10, এক্সকোড 8.3.1 এ কাজ করা)
ইগনাসিও ভালদিভিওসো

29

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

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

20
  1. আপনার নির্বাচন করুন UITableViewCell
  2. অ্যাট্রিবিট ইন্সপেক্টর এর কাছে যান
  3. পৃথককারী যান এবং এটিকে "কাস্টম ইনসেটস" এ পরিবর্তন করুন
  4. সেট leftএবং / অথবা rightক্ষেত্র। (ডিফল্টরূপে left: 15, right: 0)

দেখুন এটি কীভাবে কাজ করে (ব্যবহার করে left: 100):

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

ফলাফল:

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


1
@ হানাহ লুইসা কার্নি
কনস্টান্টিন সালাভাতভ

19

আমি উত্তরাধিকারসূত্রে পেয়েছি UITableViewControllerএবং মিথ্যাতে willDisplayCellসেট preservesSuperviewLayoutMarginsকরতে দুটি ইনসেট সেটিংসে অতিরিক্ত প্রয়োজন । সুইফটে এটি দেখতে এমন দেখাচ্ছে:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

আপনাকে সেট করতে হবে না preservesSuperviewLayoutMargins = falseকারণ ডিফল্ট মানটি ইতিমধ্যে মিথ্যা
ক্রুবিও

2
মনে রাখবেন যে কক্ষগুলি পুরো উচ্চতা তৈরি না করে যদি এটি আপনার কক্ষের নীচের দৃশ্যটি পূরণ করতে নিয়ামক দ্বারা প্রদর্শিত 'প্লেসহোল্ডার' কোষগুলিতে বিভাজকগুলিকে সামঞ্জস্য করে না।
টাইম

11

বিভাজক Insetবাম থেকে 15 ডিফল্টরূপে। বিভাজক পরিবর্তন Insetথেকে বিকল্প autoথেকে customএবং সেট করার আঁটা 0

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


9

আইওএস 9+ এ সুইফ্টের জন্য

যদি কোনও কাস্টম ব্যবহার করা হয় UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

তারপরে আপনার UITableViewজন্য viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

এটিই কেবলমাত্র আমার উত্তর যা এটি আমার জন্য স্থির করে (3 দ্রুত পরিবর্তন হয়েছে) updated যাইহোক ... কোষে ডেটা থাকলে এটি কাজ করে। খালি কোষগুলির জন্য যা এখনও পূরণ করা হয়নি (এবং আমি অনুমান করি যে এই ওভারডেন লেআউটমার্জিনগুলি পরিবর্তনশীল বলা হয়নি) বিভাজনকারী এখনও টেবিলভিউতে আমার কাস্টম ঘরের পুরো প্রশস্ততা পূরণ করে না। কোন ধারণা?
র‌্যানলার্নস 13:37

আইফোনে, বিভাজকটি বাম থেকে কয়েক পিক্সেল এবং খালি ঘরগুলিতে ডান থেকে কয়েক পিক্সেল সমাপ্ত হয়। মার্জিনগুলি শূন্য করতে এই কৌশলটি ব্যবহার না করেই ঠিক আছে। আইপ্যাডে আসল সমস্যাটি হ'ল - একটি খালি কক্ষে বিভাজকগুলি টেবিলভিউয়ের বাম প্রান্ত থেকে চলে আসে, ঘরের প্রস্থের প্রায় 80% থাকে। যখন ঘরে কোথাও ডেটা থাকে, বিভাজকটি এখনও ঘরের প্রস্থের 80% থাকে তবে এটি 20% থেকে শুরু হয় এবং টেবিলভিউয়ের ডান প্রান্তের সমস্ত পথে চলে যায়
র্যানলার্নস

1
একটি সমাধান খুঁজে পেয়েছি ... যদি # উপলভ্য থাকে তবে (আইওএস 9, *) ব্যবহার করুন {সেলফি.ট্যাব.ভেল.সেললাউটমার্জিনস ফলোআরেডেবলিউইথ = ভুয়া it এটি তৈরি করেছে যাতে আইফোনে আমার কোনও কোড প্রয়োজন হয় না। বিভাজকটি পুরো প্রস্থে চলে যায়। আইপ্যাডে, খালি সেলগুলিতে একটি পূর্ণ প্রস্থ বিভাজক থাকে, তবে ডেটা যুক্ত হওয়ার সময় আমার পুরো প্রস্থ রাখতে আপনার কোড প্রয়োজন। অন্যথায়, বামদিকে কিছু পিক্সেল যুক্ত করা হয়েছে যেখানে কোনও বার সেলটি পূরণ করার পরে কোনও বিভাজক নেই।
র‌্যানলার্নস 13:51

1
উপরের মন্তব্যে কোডটি আমি কোথায় পেয়েছি তা থেকে উত্তর দিন: stackoverflow.com/a/31538250/428981
RanLearns

9

আইপ্যাড নিয়ে সমস্যা থাকা লোকদের জন্য - এটি আপনাকে আইফোনের মতো একই অবস্থায় পেয়ে যাবে। তারপরে আপনি separatorInsetপ্রয়োজনীয় হিসাবে সামঞ্জস্য করতে পারেন ।

tableView.cellLayoutMarginsFollowReadableWidth = false

আইওএস 10 বনাম আইওএস ১১ এ এটি আমার সমস্যা ছিল আইওএস ১১ ঠিক ছিল, তবে 10 এর মার্জিন ছিল। ধন্যবাদ !!!
মাইগ্রেশন 64

9

এটিকে cellForRowAtIndexPathপদ্ধতিতে ব্যবহার করুন , ঘরের বিভাজক
স্পক্সগুলি কনফিগার করতে এটি iOS9.0 + এর জন্য উপযুক্ত

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;

8

আইওএস 9.3 এবং সুইফট 2.2 এর জন্য পরীক্ষিত। willDisplayCellসেলের প্রদর্শন করার ঠিক আগে যে কোডটি বলা হয়েছিল তা অবশ্যই সেট করুন এবং cellForRowAtIndexPathযেখানে আপনি কেবল ঘর তৈরি করেন সেখানে নয় sure

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

এর মতো overrideফাংশনে যুক্ত করুন UITableViewController:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

উপরের কোনওটিই আমার পক্ষে সুইফট ২.২ এবং এক্সকোড .3.৩.১ এ কাজ করেনি

পরিণত হয়েছে সবার সহজ সমাধান হিসাবে। কোনও কোডের দরকার নেই। TableViewCellআপনার UITableViewপরিদর্শকের মধ্যে লেআউট মার্জিনের মানগুলি পরিবর্তন করুন :


4

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

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

ইন viewDidLoad(পরীক্ষিত iOS11 - দ্রুত 4.1)

চেষ্টা

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

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

পুনরায় ব্যবহারযোগ্য কোষ সহ:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

পুনরায় ব্যবহারযোগ্য কোষ সহ:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

কেবল এই পদ্ধতির প্রসারিত করতে:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

উভয় বৈশিষ্ট্য UITableView& দ্বারা ব্যবহার করা যেতে পারে UITableViewCell। দ্বিতীয়টি প্রকৃতপক্ষে একটি সম্পত্তি UIView, যা উভয় UITableView& এর একটি পিতামাতার শ্রেণি UITableViewCell


1
পুনরায় পুনঃব্যবহারযোগ্য কক্ষগুলির জন্য আমি খুঁজে পেলাম কেবলমাত্র কার্যকর সমাধান
মিকি

0

সুইফ্ট 5, এক্সকোড 11 আপডেট

এটিকে ভিডিডিএলডের ভিতরে রাখুন ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

প্রান্ত থেকে প্রান্ত বিভাজকের জন্য কেবল বাম এবং ডানদিকে 0 নির্ধারণ করুন।

উপায় দ্বারা আপনার "টেবিলভিউ" আপনার টেবিলভিউ আউটলেট নামে পরিবর্তন করুন।

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