[ios] UITableViewCell 사이에 간격을 추가하는 방법

사이에 간격을 추가하는 방법이 UITableViewCell있습니까?

테이블을 만들었고 각 셀에는 이미지 만 포함되어 있습니다. 이미지는 다음과 같이 셀에 할당됩니다.

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

그러나 이렇게하면 이미지가 확대되어 전체 셀에 맞으며 이미지 사이에 간격이 없습니다.

또는 이런 식으로 말하면 이미지의 높이는 예를 들어 50이며 이미지 사이에 20 개의 간격을 추가하고 싶습니다. 이것을 달성 할 수있는 방법이 있습니까?



답변

스위프트 버전

스위프트 3 업데이트

이 답변은 향후 시청자를 위해 원래 질문보다 다소 일반적입니다. Swift 의 기본 UITableView 예제를 보완하는 예제 입니다.

여기에 이미지 설명을 입력하십시오

개요

기본 아이디어는 각 배열 항목에 대해 새 행이 아닌 새 섹션을 만드는 것입니다. 그런 다음 섹션 헤더 높이를 사용하여 섹션 간격을 지정할 수 있습니다.

그것을하는 방법

  • Swift의 UITableView 예제에 설명 된대로 프로젝트를 설정하십시오 . 즉, 콘센트를 추가 UITableView하고 tableView콘센트를 View Controller에 연결하십시오.

  • 인터페이스 빌더에서 기본보기 배경색을 연한 파랑으로 변경하고 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배열 요소 및 탭 위치들에 대한 적절한 값을 얻기 위해.

오른쪽과 왼쪽에 추가 패딩 / 공간을 어떻게 얻었습니까?

모든보기에 간격을 추가하는 것과 같은 방식으로 얻었습니다. 자동 레이아웃 제약 조건을 사용했습니다. 인터페이스 빌더 의 핀 도구 를 사용하여 선행 및 후행 제한 조건에 대한 간격을 추가하십시오.


답변

스위프트를 사용하는 쉬운 솔루션 :

// Inside UITableViewCell subclass

override func layoutSubviews() {
    super.layoutSubviews()

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

결과
여기에 이미지 설명을 입력하십시오


답변

셀 사이에 간격을 추가하는 방법은 numberOfSections = “배열 수”를 만들고 각 섹션에 하나의 행만 포함시키는 것입니다. 그런 다음 headerView와 높이를 정의하십시오.

- (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;
}


답변

UITableCell이 그들 사이에 “공백”을 갖는 것과 동일한 개념을 수행해야했습니다. 말 그대로 셀 사이에 공백을 추가 할 수 없으므로 UITableView의 셀 높이를 조작 한 다음 셀의 contentView에 UIView를 추가하여 셀을 위조 할 수 있습니다. 다음은 이것을 시뮬레이션 할 때 다른 테스트 프로젝트에서 수행 한 프로토 타입의 스크린 샷입니다.

UITableViewCells 사이의 간격

다음은 몇 가지 코드입니다 (참고 : 데모 목적으로 하드 코딩 된 값이 많이 있습니다)

먼저 heightForRowAtIndexPathUITableViewCell에서 다른 높이를 허용하도록를 설정해야 했습니다.

- (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;
}

다음으로 UITableViewCells의 모양과 느낌을 조작하여 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];

    }
}

whiteRoundedCornerView 높이를 70.0으로 만들었으므로 셀 높이가 실제로 80.0이지만 contentView가 70.0이므로 모양이 표시되므로 시뮬레이션 공간이 발생합니다.

이것을 더 잘 달성하는 다른 방법이있을 수 있지만 그것은 내가 그것을하는 방법을 찾은 방법입니다. 다른 사람을 도울 수 있기를 바랍니다.


답변

이미지에 프레임을 설정해야합니다. 테스트되지 않은 코드는

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


답변

나는 같은 배에 있었다. 처음에는 섹션으로 전환을 시도했지만 필자의 경우 원래 생각했던 것보다 두통이 많았으므로 대안을 찾고있었습니다. 계속 사용 하고 모델 데이터에 액세스하는 방법을 망설이지 않으려면 마스크사용하여 나에게 도움이되는 내용은 다음과 같습니다.

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/2tableView의 상단과 하단에 패딩이 있지만 및를 설정 tableView.contentInset.bottom = -verticalPadding/2하여 신속하게 해결할 수 있습니다 tableView.contentInset.top = -verticalPadding/2. 이것이 누군가를 돕기를 바랍니다!


답변

작은 공간을 찾고 아마도 가장 비싸지 않으면 셀 테두리 색을 테이블 배경색으로 설정 한 다음 테두리 너비를 설정하여 원하는 결과를 얻는 것이 가장 쉬운 해결책이라고 생각합니다!

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