ইউআইটিএবলভিউসেল এর মধ্যে কীভাবে স্পেসিং যুক্ত করা যায়


181

এর মধ্যে ব্যবধান যুক্ত করার কোনও উপায় আছে কি UITableViewCell?

আমি একটি টেবিল তৈরি করেছি এবং প্রতিটি ঘরে কেবল একটি চিত্র থাকে। চিত্রটি এভাবে সেলটিতে বরাদ্দ করা হয়েছে:

cell.imageView.image = [myImages objectAtIndex:indexPath.row];

তবে এটি চিত্রটিকে বৃহত্তর করে তোলে এবং পুরো ঘরটিতে ফিট করে এবং চিত্রগুলির মধ্যে কোনও ব্যবধান নেই।

অথবা এইভাবে বলতে পারি, চিত্রের উচ্চতা যেমন 50, এবং আমি চিত্রগুলির মধ্যে 20 স্পেসিং যুক্ত করতে চাই। এই কাজ করা সম্ভব কোনো উপায় আছে কি?


1
জন্য সুইফট 2.2 : এখানে আমার উত্তর দেখার stackoverflow.com/a/37673417/2696626
ibrahimyilmaz

উত্তর:


159

সুইফট সংস্করণ

সুইফট 3-এর জন্য আপডেট করা হয়েছে

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

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

সংক্ষিপ্ত বিবরণ

মূল ধারণাটি হ'ল প্রতিটি অ্যারে আইটেমের জন্য একটি নতুন বিভাগ (একটি নতুন সারি পরিবর্তে) তৈরি করা। বিভাগগুলি শিরোনামের উচ্চতা ব্যবহার করে স্পেস করা যায় be

এটা কিভাবে করতে হবে

  • সুইফটের জন্য ইউআইটিএবলভিউ উদাহরণে বর্ণিত হিসাবে আপনার প্রকল্পটি সেট আপ করুন । (এটি, একটি যোগ করুন UITableViewএবং tableViewভিউ কন্ট্রোলারে আউটলেটটিকে জড়িয়ে দিন)।

  • ইন্টারফেস বিল্ডারে, প্রধান দৃশ্যের পটভূমির রঙ হালকা নীল এবং UITableViewসাফ করার জন্য পটভূমির রঙ পরিবর্তন করুন ।

  • নিম্নলিখিতটির সাথে ViewController.swift কোডটি প্রতিস্থাপন করুন।

ViewController.swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    
    let cellReuseIdentifier = "cell"
    let cellSpacingHeight: CGFloat = 5
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // These tasks can also be done in IB if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    // MARK: - Table View delegate methods
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return self.animals.count
    }
    
    // There is just one row in every section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    // Set the spacing between sections
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return cellSpacingHeight
    }
    
    // Make the background color show through
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.clear
        return headerView
    }
    
    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!
        
        // note that indexPath.section is used rather than indexPath.row
        cell.textLabel?.text = self.animals[indexPath.section]
        
        // add border and color
        cell.backgroundColor = UIColor.white
        cell.layer.borderColor = UIColor.black.cgColor
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8
        cell.clipsToBounds = true
        
        return cell
    }
    
    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // note that indexPath.section is used rather than indexPath.row
        print("You tapped cell number \(indexPath.section).")
    }
}

দ্রষ্টব্য যে অ্যারে উপাদানগুলির জন্য যথাযথ মানগুলি এবং ট্যাপের অবস্থানগুলি পাওয়ার indexPath.sectionপরিবর্তে ব্যবহৃত হয় indexPath.row

আপনি ডান এবং বামে অতিরিক্ত প্যাডিং / স্থান কীভাবে পেয়েছেন?

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


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

3
@ user2901306, আমি প্রথমে এই পদ্ধতিটি ব্যবহার করতে দ্বিধা বোধ করছিলাম, কারণ আমার মনে হয়েছিল যে কেবল সারি ব্যবহার করতে এবং মার্জিন বা কিছু বাড়িয়ে তুলতে আমার সক্ষম হওয়া উচিত। যাইহোক, আমি এটি করার কোনও উপায় খুঁজে পাইনি এবং এই পদ্ধতিটি বেশ ভালভাবে কাজ করেছে। আপনার সেলটিতে কাস্টমাইজেশন পরিবর্তন করতে হবে না। মূলত আপনাকে কেবল যুক্ত করতে হবে numberOfSectionsInTableViewএবং return 1সারিগুলির সংখ্যার জন্য। তারপরে indexPath.sectionবর্তমান সেল সূচক পেতে ব্যবহার করুন । একবার চেষ্টা করে দেখুন আমি মনে করি আপনি আবিষ্কার করতে পারবেন যে আপনার বর্তমান সেটআপে খুব বেশি পরিবর্তন করার দরকার নেই। এটি অবশ্যই সাবক্লাসিংয়ের চেয়ে সহজ।
সুরগাচ

সেলফোর্ডে সেল.লেয়ার.এক্সএক্সএক্সএক্স ব্যবহার করা আপনাকে পারফরম্যান্স হিট দিতে পারে। একাদশে এই মানগুলি আরও ভাল সেট করুন
অভিষেক বেদী

@ অভিষেকবেদি, আমি সর্বদা হেরফেরগুলি layerবেশ দ্রুত পেয়েছি । আপনি কোনও পারফরম্যান্স হিট লক্ষ্য করেছেন বলে, বা সাধারণ ভাল অনুশীলন হিসাবে আপনি এটি বলছেন? এমনকি যদি আপনি এগুলিকে XIB তে সেট করেন তবে সেলটি তৈরি করার পরে তাদের এখনও সেট করতে হবে।
সুরগাচ

1
@ ফেটনুলার, আমি আপনার সাথে একমত নই হুসামের উত্তর বেশ ভাল লাগছে।
সুরগাচ

150

সুইফট ব্যবহার করে আমার সহজ সমাধান :

// Inside UITableViewCell subclass

override func layoutSubviews() {
    super.layoutSubviews()

    contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
}

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


11
সুন্দর সমাধান। কারও যদি সমস্যা হয় তবে super.layoutSubviews()তার ফ্রেম সেট করার আগে পুরো ভিউটি সঠিকভাবে ছড়িয়ে দেওয়া হয়েছে তা নিশ্চিত করার জন্য আমাকে প্রথমে কল করতে হয়েছিল।
ruttopia

@ হুসাম আপনার সমাধানটি আমার পক্ষে কাজ করেছে। সেল নির্বাচন করার সময় আমার একটি সমস্যা আছে। আমি কন্টেন্টভিউয়ের জন্য সীমানা সেট করেছি এবং যখনই আমি সেলটি নির্বাচন করেছি তখনই সীমানা আরও ছোট হবে। আমি কীভাবে এটি ঠিক করতে পারি?
খারাপ_ডভোপার

@SonHoang আপনি ওভাররাইড করার প্রয়োজন হতে পারে didSetজন্য selectedপরিবর্তনশীল এবং কল layoutSubviews()ভিতরে!
হুশাম

1
হেই, হুসাম। দুর্দান্ত সমাধানের জন্য ধন্যবাদ। কোষগুলির মধ্যে যুক্ত হওয়া সামগ্রীর রঙ কীভাবে পরিবর্তন করবেন তা আমাকে বলবেন না?
কান্ট

1
এটি গৃহীত উত্তরের চেয়ে অনেক বেশি ভাল সমাধান। গৃহীত উত্তরে কোডের 100 টি লাইনের নিকটে অভিশাপ রয়েছে এবং এটি কেবল একটি। অবিশ্বাস্য।
ইয়ুংগুন

135

আমি কক্ষগুলির মধ্যে ব্যবধান যোগ করার উপায়টি হ'ল নাম্বার অফসেকশন = "আপনার অ্যারে গণনা" তৈরি এবং প্রতিটি বিভাগে কেবল একটি সারি থাকে। এবং তারপরে হেডারভিউ এবং এর উচ্চতা নির্ধারণ করুন।

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return yourArry.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return cellSpacingHeight;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *v = [UIView new];
    [v setBackgroundColor:[UIColor clearColor]];
    return v;
}

22
এটি দুর্দান্ত কাজ করে। আমাকে সেলফোরআরএটআইএনডেক্সপথটি কিছুটা পরিবর্তন করতে হয়েছিল, সাধারণ অ্যারে [সূচিপথ.রো] নয় তবে অ্যারে [সূচিপথ.সেকশন]। অন্যথায় এটি বিভাগে অ্যারের প্রথম আইটেমটি প্রদর্শন করবে।
টম স্পী

@ টমস্পি - আপনি কীভাবে এই সমস্যাটিকে সেলফোরোআউটইন্টেক্সপথে সমাধান করেছেন?

5
@ টিটুকটাল - ঠিক সেলফোর্ডআউটইন্ডেক্সপথের সাধারণ কোডের মতোই তবে সূচিপথ.রোকে সূচিপথ.সেকশন-তে পরিবর্তন করুন
টম স্পি

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

2
তারপরে অ্যাপলের পরিবর্তে অভিযোগ করা উচিত নয় তবে সারিগুলির মধ্যে পৃথক স্থানের জন্য একটি সুবিধাজনক পদ্ধতি তৈরি করা উচিত।
আর্নি শোয়ার্জভোগেল

44

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

ইউআইটিএবলভিউকেলগুলির মধ্যে ব্যবধান

এখানে কিছু কোড রয়েছে (দ্রষ্টব্য: প্রদর্শনের উদ্দেশ্যে প্রচুর হার্ড কোডিং মান রয়েছে)

প্রথমত, heightForRowAtIndexPathইউআইটিএবলভিউসেলতে বিভিন্ন উচ্চতার জন্য আমাকে সেট করার দরকার হয়েছিল।

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

    NSString *text = [self.newsArray  objectAtIndex:[indexPath row]];
    if ([text isEqual:@"December 2012"])
    {
        return 25.0;
    }

    return 80.0;
}

এরপরে, আমি ইউআইটিএবলভিউকেলগুলির চেহারা এবং অনুভূতিকে কাজে লাগাতে চাই যাতে willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPathপদ্ধতিতে আমি এটি করি ।

- (void)tableView:(UITableView *)tableView willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.IsMonth)
    {
        UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 20, 20)];
        av.backgroundColor = [UIColor clearColor];
        av.opaque = NO;
        av.image = [UIImage imageNamed:@"month-bar-bkgd.png"];
        UILabel *monthTextLabel = [[UILabel alloc] init];
        CGFloat font = 11.0f;
        monthTextLabel.font = [BVFont HelveticaNeue:&font];

        cell.backgroundView = av;
        cell.textLabel.font = [BVFont HelveticaNeue:&font];
        cell.textLabel.textColor = [BVFont WebGrey];
    }


    if (indexPath.row != 0)
    {
        cell.contentView.backgroundColor = [UIColor clearColor];
        UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,70)];
        whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];
        whiteRoundedCornerView.layer.masksToBounds = NO;
        whiteRoundedCornerView.layer.cornerRadius = 3.0;
        whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1);
        whiteRoundedCornerView.layer.shadowOpacity = 0.5;
        [cell.contentView addSubview:whiteRoundedCornerView];
        [cell.contentView sendSubviewToBack:whiteRoundedCornerView];

    }
}

মনে রাখবেন যে আমি আমার সাদাটেউন্ডেড কর্নারভিউ উচ্চতা 70.0 করেছি এবং এটিই সিমুলেটেড স্পেসের কারণ কারণ ঘরের উচ্চতা আসলে 80.0 কিন্তু আমার কন্টেন্টভিউ 70.0 যা এটির উপস্থিতি দেয়।

এটি আরও ভাল অর্জনের অন্যান্য উপায় থাকতে পারে তবে এটি কীভাবে পেল তা আমি ঠিক কীভাবে করেছি। আমি আশা করি এটি অন্য কাউকে সাহায্য করতে পারে।


খুব বড় সংখ্যক কক্ষের জন্য কেবল একটি এফওয়াইআই, আপনি উইলডিসপ্লেসেলের পরিবর্তে কক্ষ সাবক্লাসের ভিতরে সামগ্রী সামগ্রী সেট করতে চান। পারফরম্যান্সটি এভাবে এক বিশাল হিট নিতে শুরু করে আপনি কাতারে আরও বেশি ঘর যুক্ত করবেন
BBH1023

@ বিবিএইচ 1023 দ্রুত দেখার জন্য পিছনে পিছনে নেভিগেট করার সময় ছায়া স্তরটি যতবার দৃশ্য দেখা যায় ততবার গুন হয়। যদি ইতিমধ্যে এটি একবার প্রয়োগ করা হয় তবে আপনি কীভাবে এটি বাতিল করার পরামর্শ
দিবেন

আরও ছায়া যুক্ত করার জন্য প্রাইভেন্ট করতে এটি করুন: এনএসআইঞ্জার ট্যাগ = 120; if (indexPath.row! = 0) {if (cell.tag! = 120) {সেল কন্টেন্টভিউ.ব্যাকগ্রাউন্ড কালার = [ইউআইসি কালার ক্লিয়ার কালার]; ... [সেল কনটেন্টভিউ সেন্ডসউবভিউ টোব্যাক: হোয়াইটরাউন্ডডকর্নারভিউ]; সেল.ট্যাগ = ট্যাগ; }}
ব্যবহারকারী3001228

24

আপনি আপনার ইমেজ ফ্রেম সেট করতে হবে। অনির্ধারিত কোডটি

cell.imageView.frame = CGRectOffset(cell.frame, 10, 10);

2
ব্যাকগ্রাউন্ডভিউয়ের সাথে সবেমাত্র পরীক্ষিত এবং এটি সর্বাধিক সহজ সমাধান সমাধান
স্যাম

2
layoutSubviewsআপনি যদি সাবক্লাসিং করে থাকেন তবে কেবল এই কোডটি কল করেছেন তা নিশ্চিত করুনUITableViewCell
মজইড

30
@ নিকোহ্যামালিনেন ওয়েল, আমি গত তিন বছরে ২০ টিরও বেশি অ্যাপ্লিকেশন তৈরি করেছি এবং আমার UITableViewCellযে ফলাফলটি প্রয়োজন তা করার জন্য আমি সবসময় সাবক্লাস করেছি :) ... সাবক্লাসিং UITableViewCellখুব সাধারণ বিষয়।
মাজিওদ

1
@ নিকোহামালিয়েনেন সাবক্লাসিংয়ে কোনও ভুল নেই UITableViewCell। আপনি যখন কাস্টম তৈরি করছেন তখন আপনার UITableViewCellsসাবক্লাসিং করা উচিত UITableViewCell
পোপিয়ে

1
@ নিকোহ্যামালিনেন আপনার নিজের মন্তব্যটি আপডেট করা উচিত। লোকেরা তথ্য দখল করার প্রবণতা রাখে এবং আরও পড়বে না। যেহেতু এই সাইটটি একটি দুর্দান্ত সংস্থান এবং বিকাশকারীরা তারা এখানে দেখেছে এমন তথ্যের উপর নির্ভর করে যা এটি তাদেরকে ভয়ানক জিনিসগুলি ভেবে ভ্রান্ত করতে পারে .. কেবল আমার দুটি কয়েন। হতে পারে আমার হিস্টিরিয়া রয়েছে
chrs

11

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

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let verticalPadding: CGFloat = 8

    let maskLayer = CALayer()
    maskLayer.cornerRadius = 10    //if you want round edges
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.frame = CGRect(x: cell.bounds.origin.x, y: cell.bounds.origin.y, width: cell.bounds.width, height: cell.bounds.height).insetBy(dx: 0, dy: verticalPadding/2)
    cell.layer.mask = maskLayer
}

আপনার যা যা করা বাকি রয়েছে তা হ'ল আপনার পছন্দসই মানের মতোই সেলটির উচ্চতা আরও বড় করে তুলুন verticalPaddingএবং তারপরে আপনার অভ্যন্তরের বিন্যাসটি সংশোধন করুন যাতে ঘরের প্রান্তগুলিতে ফাঁকা থাকা যে কোনও ভিউগুলি একই ব্যবধান বৃদ্ধি করে verticalPadding/2। মাইনর ডাউনসাইড: আপনি পাবেনverticalPadding/2 উভয় উপরে এবং tableView নীচে প্যাডিং, কিন্তু আপনি দ্রুত সেটিং দ্বারা এই ঠিক করতে পারবো tableView.contentInset.bottom = -verticalPadding/2এবং tableView.contentInset.top = -verticalPadding/2। আশা করি এটি কারও সাহায্য করবে!


1
সুইফট 5 এও কাজ করে।
লন্ডনগুই

1
সর্বোত্তম উত্তর!! ধন্যবাদ. যদি কোনও কাস্টম সেল ব্যবহার করা হয়, তবে এটি "ওভাররাইড ফানক জাগ্রত থেকে ফ্রমনিব ()"
ট্রি_পরে_গ্রেট

10

আমি মনে করি সর্বাধিক সোজা ফরোয়ার্ড সলিউশন যদি আপনার কেবল সামান্য জায়গা সন্ধান করা হয় এবং সম্ভবত ব্যয়বহুল ব্যয় হয় কেবল আপনার টেবিলের পটভূমির রঙের জন্য ঘরের সীমানার রঙ সেট করে তারপর পছন্দসই ফলাফল পেতে সীমানা প্রস্থ নির্ধারণ করুন!

    cell.layer.borderColor = blueColor.CGColor
    cell.layer.borderWidth = 3

স্বচ্ছ পটভূমির জন্য ভাল ধারণা নয়। অন্যথায়, এটি কাজ করতে পারে।
এরগুনোকোকাক

এটা সত্য. সমস্ত ক্ষেত্রে সমাধান নয় তবে এটি কিছু ক্ষেত্রে কার্যকর হবে! @ এরগুনোকোকাক
ক্রেগ

8

আপনি যদি ইতিমধ্যে বিভাগ শিরোনাম (বা পাদচরণ) ব্যবহার না করে থাকেন তবে আপনি এগুলি টেবিল কোষগুলিতে নির্বিচার ফাঁক যোগ করতে ব্যবহার করতে পারেন। এন সারিগুলির সাথে একটি বিভাগ থাকার পরিবর্তে, প্রতিটি সারি দিয়ে n বিভাগযুক্ত একটি টেবিল তৈরি করুন।

ব্যবধানটি tableView:heightForHeaderInSection:নিয়ন্ত্রণ করতে পদ্ধতিটি প্রয়োগ করুন ।

tableView:viewForHeaderInSection:ব্যবধানটি কী দেখায় তা নিয়ন্ত্রণ করতে আপনি প্রয়োগ করতেও পারেন ।


8

আমি এটি সুইফট 4 এ এভাবে সমাধান করেছি।

আমি ইউআইটিএবলভিউসিলের একটি এক্সটেনশন তৈরি করেছি এবং এই কোডটি অন্তর্ভুক্ত করেছি:

override open var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame =  newFrame
        frame.origin.y += 10
        frame.origin.x += 10
        frame.size.height -= 15
        frame.size.width -= 2 * 10
        super.frame = frame
    }
}

override open func awakeFromNib() {
    super.awakeFromNib()
    layer.cornerRadius = 15
    layer.masksToBounds = false
}

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


ঘরে পাঠ্য ক্রপ করা হয়।
মেহেদিকো

সিজিআরেক্ট ওভাররাইড কাজ করছে, এবং আমি জাগ্রত থেকে কোনও যোগ করি নি।
এরিক টান

5

দ্রুত 3 এ উদাহরণ ..

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

  1. একটি একক দর্শন অ্যাপ্লিকেশন তৈরি করুন
  2. দেখুন নিয়ামক টেবিলভিউ যোগ করুন
  3. ট্যাবলভিউ কক্ষের জন্য একটি কাস্টমসেল যুক্ত করুন
  4. দেখুন কন্ট্রোলার কোড মত নম্র

       class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
       @IBOutlet weak var tableView: UITableView!
    
    
        var arraytable = [[String:Any]]()
         override func viewDidLoad() {
         super.viewDidLoad()
    
         arraytable = [
         ["title":"About Us","detail":"RA-InfoTech Ltd -A Joint Venture IT Company formed by Bank Asia Ltd"],
         ["title":"Contact","detail":"Bengal Center (4th & 6th Floor), 28, Topkhana Road, Dhaka - 1000, Bangladesh"]
    ]
    
    
    
    
    
    
       tableView.delegate = self
       tableView.dataSource = self
    
       //For Auto Resize Table View Cell;
      tableView.estimatedRowHeight = 44
       tableView.rowHeight = UITableViewAutomaticDimension
    
       //Detault Background clear
       tableView.backgroundColor = UIColor.clear
    }

    ফানক নম্বরঅফেকশনস (টেবিলভিউতে: ইউআইটিএলভিউ) -> ইনট {রিটার্ন অ্যারেটেবল.কাউন্ট}

       func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return 1
     }
    
    // Set the spacing between sections
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
    }
    
    // Make the background color show through
      func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView()
    headerView.backgroundColor = UIColor.clear
    
    return headerView
    }
    
         func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as! CustomCell
    
         cell.tv_title.text = arraytable[indexPath.section]["title"] as! String?
        cell.tv_details.text = arraytable[indexPath.section]["detail"] as! String?
    
       //label height dynamically increase
       cell.tv_details.numberOfLines = 0
    
    
    
    
       //For bottom border to tv_title;
       let frame =  cell.tv_title.frame
        let bottomLayer = CALayer()
       bottomLayer.frame = CGRect(x: 0, y: frame.height - 1, width: frame.width, height: 1)
        bottomLayer.backgroundColor = UIColor.black.cgColor
       cell.tv_title.layer.addSublayer(bottomLayer)
    
      //borderColor,borderWidth, cornerRadius
      cell.backgroundColor = UIColor.lightGray
      cell.layer.borderColor = UIColor.red.cgColor
      cell.layer.borderWidth = 1
      cell.layer.cornerRadius = 8
      cell.clipsToBounds = true
    
      return cell
      }
    
       }
  5. গিথুবকে সম্পূর্ণ উত্স ডাউনলোড করুন: লিঙ্ক

    https://github.com/enamul95/CustomSectionTable


এটি অন্য উত্তরটির সদৃশ হয়েছিল যে @ সুরগাচ এর আগে দ্রুত সংস্করণের জন্য উত্তর দেওয়া হয়েছে, অনুগ্রহ করে অনুলিপি করা এড়াবেন
আমর অ্যাগ্রি

1
এটি একটি ভাল সমাধান নয়। আপনার যদি শিরোনাম সহ শিরোনাম বিভাগের প্রয়োজন হয় তবে এটি কাজ করবে না
কুজডু

4

আমি তিনটি পদ্ধতির কথা ভাবতে পারি:

  1. একটি কাস্টম টেবিল সেল তৈরি করুন যা আপনার ইচ্ছানুসারে পুরো ঘরটির দৃশ্য প্রদর্শন করে

  2. চিত্রের দৃশ্যে ছবিটি যুক্ত করার পরিবর্তে চিত্রের দৃশ্যের সংক্ষিপ্তসারগুলি সাফ করুন, একটি কাস্টম ভিউ তৈরি করুন যা চিত্রের জন্য একটি ইউআইআইমেজভিউ এবং অন্য ভিউ যুক্ত করে, সম্ভবত একটি সাধারণ ইউআইভিউ যা পছন্দসই ব্যবধান সরবরাহ করে এবং এর সংক্ষিপ্তসার হিসাবে এটি যুক্ত করুন চিত্র দেখুন।

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

যে জানার জন্য?


4

হ্যাঁ আপনি ঘরে কন্টেন্ট ভিউতে একটি বেস ভিউ তৈরি করে দুটি কক্ষের মধ্যে ব্যবধান (প্যাডিং) বাড়িয়ে বা হ্রাস করতে পারেন content বিষয়বস্তু দেখার পটভূমির জন্য পরিষ্কার রঙ নির্ধারণ করুন এবং আপনি ঘরগুলির মধ্যে স্থান তৈরি করতে বেস ভিউটির উচ্চতা সামঞ্জস্য করতে পারেন।


4

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

@implementation TableViewCell

- (void)awakeFromNib { 
    ... 
}

- (void) layoutSubviews {
    [super layoutSubviews];

    CGRect newFrame = UIEdgeInsetsInsetRect(self.layer.frame, UIEdgeInsetsMake(4, 0, 4, 0));
    self.layer.frame = newFrame;
}

@end

3

বিভাগে সারিগুলির সংখ্যা 1 তে পরিবর্তন করুন আপনি সারিগুলির সংখ্যার পরিবর্তে বিভাগের সংখ্যা পরিবর্তন করেছেন

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        1
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

এখানে আপনি সারিগুলির মধ্যে ব্যবধান রেখেছেন

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }

2

আমি মনে করি এটিই সবচেয়ে পরিষ্কার সমাধান:

class MyTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        layoutMargins = UIEdgeInsetsMake(8, 0, 8, 0)
    }
}

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

মার্জিনগুলি ঘরের জন্য একটি সুস্পষ্ট উচ্চতা "ভাঙ্গন" করতে পারে না, সুতরাং আপনার কাজ করার জন্য কোষগুলির জন্য স্বয়ংক্রিয় উচ্চতা থাকা দরকার
অ্যাভিয়েল গ্রস

1
আমার স্বয়ংক্রিয় উচ্চতা আছে।
সিউর

2

এই নিবন্ধটি সাহায্য করেছে, অন্যান্য উত্তরগুলি যা বলেছিল তা সংক্ষিপ্ত করে এবং সংক্ষিপ্ত করে তোলে pretty

https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6

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

func UIEdgeInsetsMake (_ শীর্ষ: সিজিফ্লোট, _ বাম: সিজিফ্লোট, _ নীচে: সিজিফ্লোট, _ ডান: সিজিফ্লোট) -> ইউআইএডিজইনসেটস

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

পরামিতি
শীর্ষ: একটি সামগ্রীর শীর্ষে ইনসেট।
বাম: একটি বস্তুর
নীচে বামে ইনসেট: কোনও বস্তুর নীচে ইনসেট set
ডান: একটি বস্তুর ডানদিকে ইনসেট।


একটি বোতাম বা দেখার জন্য একটি ইনসেট ফেরত দেয়

নোট করুন যে UIEdgeInsets এছাড়াও এটি অর্জন করতে ব্যবহার করা যেতে পারে।

এক্সকোড 9.3 / সুইফট 4


এই উত্তরটি ভুলভাবে বলেছে কোডটি সুইফট 4 সামঞ্জস্যপূর্ণ, তবে ইউআইইডিজইনসেটমেককে হ্রাস করা হয়েছে। পরিবর্তে UIEdgeInsets ব্যবহার করা উচিত।
জোসে

developer.apple.com/docamentation/uikit/… ঠিক কোথায় এটি বলে যে এটি হ্রাস করা হয়েছে? আমি এটি আমার প্রকল্পগুলিতে ব্যবহার করি এবং আমি সর্বশেষতম এক্সকোডের সাথে কাজ করছি, অতএব সুইফট 9.3 @ জোসে
মরিসিও চিরিনো

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

1
ঠিক আছে বুঝেছি. দয়া করে ডাউনটোটটি সরিয়ে ফেলুন আপনি যদি দয়া করে কাস্ট করেছিলেন তবে আমি কখনও বলিনি যে আমার উত্তরই কেবল সম্ভব।
মৌরিসিও চিরিনো

এটি বলে যে আপনি নিজের উত্তর পরিবর্তন না করে আমি আমার ভোট পরিবর্তন করতে পারি না। আপনি কি শব্দটি সামান্য একটু টুইচ করতে পারেন?
জোস

2

বিভিন্ন বিভাগের গুচ্ছ ব্যবহার করার প্রয়োজন নেই। অন্যান্য উত্তরগুলি ফ্রেম ইনসেট এবং সিজিআরেক্ট এবং স্তর এবং ... BLAH ব্যবহার করে। ভাল না; অটো লেআউট এবং একটি কাস্টম ইউআইটিএবলভিউসেল ব্যবহার করুন। সেই ইউআইটিএবলভিউসেলটিতে কন্টেন্টভিউয়ের অভ্যন্তরে আপনার সামগ্রী সাব-ভিউয়ের পরিবর্তে একটি নতুন কনটেইনারভিউ (একটি ইউআইভিউ) করুন, কনটেন্টভিউয়ের ভিতরে ধারক দৃশ্যের সাবউভিউ করুন, তারপরে ধারক দৃশ্যের ভিতরে আপনার সমস্ত দৃষ্টিভঙ্গি সাবভিউ করুন।

এখনই ব্যবধান তৈরি করতে, কেবল ধারক দৃশ্যের বিন্যাসের মার্জিনগুলি সম্পাদনা করুন, এর মতো:

class CustomTableViewCell: UITableViewCell {
    let containerView = UIView()
    let imageView = UIImageView()

    required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)}

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        containerView.translatesAutoResizingMaskIntoConstraints = false
        imageView.translatesAutoResizingMaskIntoConstraints = false
        contentView.addSubview(containerView)
        containerView.addSubview(imageView)

        contentView.layoutMargins = UIEdgeInsets(top: 15, left: 3, bottom: 15, right: 3)
        containerView.layoutMargins = UIEdgeInsets(top: 15, left: 17, bottom: 15, right: 17) // It isn't really necessary unless you've got an extremely complex table view cell. Otherwise, you could just write e.g. containerView.topAnchor

        let cg = contentView.layoutMarginsGuide
        let lg = containerView.layoutMarginsGuide
        NSLayoutConstraint.activate([
            containerView.topAnchor.constraint(equalTo: cg.topAnchor),
            containerView.leadingAnchor.constraint(equalTo: cg.leadingAnchor),
            containerView.trailingAnchor.constraint(equalTo: cg.trailingAnchor),
            containerView.bottomAnchor.constraint(equalTo: cg.bottomAnchor),
            imageView.topAnchor.constraint(equalTo: lg.topAnchor),
            imageView.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
            imageView.bottomAnchor.constraint(equalTo: lg.bottomAnchor)
        ])
    }
}

1

- (UIEdgeInsets) লেআউটমার্গিনগুলি সন্ধান করার চেষ্টা করুন; কোষে


1

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


1

আমার সমাধানটি গিটিহাবটিতেUITableView অবজেক্টিভ-সি এর রানটাইম বৈশিষ্ট্যগুলির সাবক্লাসিং এবং ব্যবহার সহ পরীক্ষা করে দেখুন ।
এটি মূলত অ্যাপলের ব্যক্তিগত ডেটা স্ট্রাকচারটি ব্যবহার করে UITableViewRowDataযা আমি ব্যক্তিগত রানটাইম হেডারটির সন্ধান পেয়েছিUITableView :

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h / / / / / ,

এবং এখানে কাঙ্ক্ষিত প্রাইভেট ক্লাস রয়েছে যা আপনার ঘরের স্পেসিংগুলি লেআউট করার জন্য প্রয়োজনীয় সমস্ত কিছু রাখে তবে কোষগুলির শ্রেণিতে সেট না করেই আপনি চান:

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h


1

সেলটিতে ব্যাকগ্রাউন্ড রঙ এবং আনুষাঙ্গিক দর্শনগুলির পাশাপাশি এটি কাজ করতে আমার সমস্যা হয়েছিল। শেষ পর্যন্ত:

1) পটভূমির রঙের সাথে একটি ইউআইভিউ সেট দিয়ে ঘরগুলির ব্যাকগ্রাউন্ড ভিউ সম্পত্তি সেট করুন।

let view = UIView()
view.backgroundColor = UIColor.white
self.backgroundView = view

2) ব্যবধানের ধারণা যুক্ত করতে লেআউটসুভিউগুলিতে এই দৃশ্যটিকে পুনরায় অবস্থান দিন

override func layoutSubviews() {
    super.layoutSubviews()
    backgroundView?.frame = backgroundView?.frame.inset(by: UIEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)) ?? CGRect.zero
}

1

ব্যবধান হিসাবে শিরোলেখ ব্যবহার করা সূক্ষ্মভাবে কাজ করবে আমার ধারণা আপনি যদি কোনও শিরোনাম ব্যবহার করতে না চান। অন্যথায়, সম্ভবত সেরা ধারণা না। আমি যা ভাবছি তা হ'ল একটি কাস্টম সেল ভিউ তৈরি করা।

উদাহরণ:

কাস্টম ঘরে, সীমাবদ্ধতার সাথে একটি পটভূমি দৃশ্য তৈরি করুন যাতে এটি পুরো ঘরটি পূরণ না করে, কিছু প্যাডিং দেয় give

তারপরে, টেবিলভিউ ব্যাকগ্রাউন্ডটিকে অদৃশ্য করে তুলুন এবং বিভাজকগুলি সরান:

// Make the background invisible
tableView.backgroundView = UIView()
tableView.backgroundColor = .clear

// Remove the separators
tableview.separatorStyle = .none

1

আপনি যদি নিজের টেবিল ভিউটির বিভাগ এবং সারি নম্বর পরিবর্তন করতে চান না (যেমন আমি করেছি) তবে আপনি যা করেন তা এখানে:

1) আপনার টেবিল ঘর দেখার নীচে একটি চিত্রভিউ যুক্ত করুন।

2) এটিকে টেবিল ভিউটির পটভূমির রঙের মতো একই রঙ করুন।

আমি আমার অ্যাপ্লিকেশনটিতে এটি করেছি এবং এটি পুরোপুরি কার্যকর হয়। চিয়ার্স! : ডি


0

এখানে চিত্র বর্ণনা লিখুনসুইট -5, ইউআইটিএবলভিউসেলের মধ্যে ব্যবধান

    1. use sections instead of rows
    2. each section should return one row
    3. assign your cell data like this e.g [indexPath.section], instead of row
    4. use UITableView Method "heightForHeader" and return your desired spacing
    5. Do rest things as you were doing it

    Thanks!

0

আপনি এই জাতীয় কোডগুলিতে কেবল সীমাবদ্ধতা ব্যবহার করতে পারেন:

class viewCell : UITableViewCell 
{

@IBOutlet weak var container: UIView!



func setShape() {
    self.container.backgroundColor = .blue
    self.container.layer.cornerRadius = 20
    container.translatesAutoresizingMaskIntoConstraints = false
    self.container.widthAnchor.constraint(equalTo:contentView.widthAnchor , constant: -40).isActive = true
           self.container.heightAnchor.constraint(equalTo: contentView.heightAnchor,constant: -20).isActive = true
           self.container.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
           self.container.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true

    }
}

সাবউভিউ (ধারক) যুক্ত করা এবং এটিতে অন্যান্য উপাদান যুক্ত করা গুরুত্বপূর্ণ।


-1

সুইফ্ট 5.0 সমাধান

ইউআইটিএবলভিউসেল সাবক্লাসের ভিতরে

override func layoutSubviews() {
    super.layoutSubviews()
    let padding = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
    bounds = UIEdgeInsetsInsetRect(bounds, padding)
}

-2

কক্ষে অভ্যন্তরীণ দৃশ্য যুক্ত করুন তারপরে এটিতে নিজের মতামত যুক্ত করুন।


-4

UITableViewDelegate ব্যবহার করুন heightForRowAtIndexPathএবং সারিটির উচ্চতা ফিরিয়ে দিন।

 (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return 100.0f ;
}

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