사이에 간격을 추가하는 방법이 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를 추가하여 셀을 위조 할 수 있습니다. 다음은 이것을 시뮬레이션 할 때 다른 테스트 프로젝트에서 수행 한 프로토 타입의 스크린 샷입니다.
다음은 몇 가지 코드입니다 (참고 : 데모 목적으로 하드 코딩 된 값이 많이 있습니다)
먼저 heightForRowAtIndexPath
UITableViewCell에서 다른 높이를 허용하도록를 설정해야 했습니다.
- (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/2
tableView의 상단과 하단에 패딩이 있지만 및를 설정 tableView.contentInset.bottom = -verticalPadding/2
하여 신속하게 해결할 수 있습니다 tableView.contentInset.top = -verticalPadding/2
. 이것이 누군가를 돕기를 바랍니다!
답변
작은 공간을 찾고 아마도 가장 비싸지 않으면 셀 테두리 색을 테이블 배경색으로 설정 한 다음 테두리 너비를 설정하여 원하는 결과를 얻는 것이 가장 쉬운 해결책이라고 생각합니다!
cell.layer.borderColor = blueColor.CGColor
cell.layer.borderWidth = 3