그룹화 된 스타일로 UITableView에서 셀의 너비를 설정하는 방법


107

이틀 정도 작업을 해왔 기 때문에 배운 내용을 여러분과 공유한다고 생각했습니다.

질문은 : 그룹화 된 UITableView에서 셀의 너비를 더 작게 만들 수 있습니까?

내 대답은 아니오 야.

그러나이 문제를 해결할 수있는 두 가지 방법이 있습니다.

솔루션 # 1 : 더 얇은 테이블 tableView의 프레임을 변경하여 테이블을 더 작게 만들 수 있습니다. 이렇게하면 UITableView가 축소 된 너비로 셀 내부를 렌더링합니다.

이에 대한 해결책은 다음과 같습니다.

-(void)viewWillAppear:(BOOL)animated
{
    CGFloat tableBorderLeft = 20;
    CGFloat tableBorderRight = 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
    tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
    tableView.frame = tableRect;
}

솔루션 # 2 : 이미지로 셀 렌더링

이 솔루션은 http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html에 설명되어 있습니다.

이 정보가 도움이 되었기를 바랍니다. 많은 가능성을 시도하는 데 약 2 일이 걸렸습니다. 이것이 남은 것입니다.


3
두 번째 줄 ( "The question is : ...") 만있는 질문으로 설정되어야한다고 생각합니다. 그러면 솔루션 # 1과 솔루션 # 2가 두 개의 개별 답변으로 게시되고 그중 하나가 수락됩니다. 그런 다음 다른 사용자가 자신의 답변을 추가하고 그중 하나가 더 나아지면 나중에 수락 된 답변을 변경할 수 있습니다.
GeneralMike 2013

답변:


226

이를 달성하는 더 좋고 깨끗한 방법은 UITableViewCell을 서브 클래 싱하고 다음과 -setFrame:같이 메서드를 재정의하는 것입니다.

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

왜 더 낫습니까? 다른 두 개가 더 나쁘기 때문입니다.

  1. 표보기 너비 조정 -viewWillAppear:

    우선, 이것은 신뢰할 수 없으며, 수퍼 뷰 또는 상위 뷰 컨트롤러 -viewWillAppear:가 호출 된 후에 테이블 뷰 프레임을 더 조정할 수 있습니다 . 물론 -setFrame:여기에서 UITableViewCells에 대해 수행하는 것처럼 UITableView에 대해 하위 클래스를 만들고 재정의 할 수 있습니다 . 그러나 UITableViewCells를 서브 클래 싱하는 것은 훨씬 일반적이고 가볍고 Apple 방식입니다.

    둘째, UITableView에 backgroundView가있는 경우 backgroundView가 함께 좁혀지는 것을 원하지 않습니다. UITableView 너비를 좁히면서 backgroundView 너비를 유지하는 것은 사소한 작업이 아닙니다. 수퍼 뷰를 넘어서 하위보기를 확장하는 것은 처음에 매우 우아한 일이 아닙니다.

  2. 더 좁은 너비를 가짜로 만드는 사용자 지정 셀 렌더링

    이렇게하려면 가로 여백이있는 특수 배경 이미지를 준비해야하며 여백을 수용 할 수 있도록 셀의 하위보기를 직접 레이아웃해야합니다. 이에 비해 단순히 전체 셀의 너비를 조정하면 자동 크기 조정이 모든 작업을 수행합니다.


2
이것은 멋지고 우아한 솔루션입니다. 저는 카테고리에서 해냈습니다. :) 또한 투명 객체가 많을수록 CPU 부하가 더 많다는 것을 알 수 있습니다. :)
mister koz

11
@misterkoz-주의 사항 : 일부 iOS 컨트롤 (명확한 UIDatePicker)은 내부적으로 UITableViewCells를 사용하고이를 범주에서 구현하면 중단됩니다.
Clafou

7
이 방법은 편집 모드에서 셀을 제거하려고 할 때 iOS8에서 작동하지 않는 것 같습니다. setFrame은 편집 모드에 들어가거나 나갈 때 호출되어 셀이 계속 축소됩니다. 이것에 대한 해결책이 있습니까?
John Baum

3
이 힘의 도움을 (내 경우에는 적어도 작동) @JohnBaum : stackoverflow.com/questions/25911484/ios-8-cell-resizing/...
HashtagMarkus

2
이 솔루션은 진정으로 신의 선물입니다. - 경우 누군가가 빠른에서 동일한 작업을 수행하는 방법을 궁금해 reddit.com/r/swift/comments/2fr849/...
SYSUSER

16

변수를 설정하는 메서드를 제공하지 않는 Swift에서이를 수행하려면 frame. 원래 (적어도 내가 찾은 곳에서) 여기에 게시했습니다 .

override var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        let inset: CGFloat = 15
        var frame = newFrame
        frame.origin.x += inset
        frame.size.width -= 2 * inset
        super.frame = frame
    }
}

신속한 작업
Simon McNeil

9

아무것도 작동하지 않으면 시도해 볼 수 있습니다.

셀의 배경색을 선명한 색상으로 만들고 필요한 크기의 셀 이미지를 넣습니다. 해당 셀에 일부 텍스트를 표시하려면 이미지 위에 레이블을 넣으십시오. 레이블의 배경색도 클리어 색상으로 설정하는 것을 잊지 마십시오.


8

허용 된 솔루션이 회전시 작동하지 않음을 발견했습니다. 고정 너비 및 유연한 여백으로 UITableViewCells를 달성하기 위해 위의 솔루션을 다음과 같이 조정했습니다.

- (void)setFrame:(CGRect)frame {

    if (self.superview) {
        float cellWidth = 500.0;
        frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
        frame.size.width = cellWidth;
    }

    [super setFrame:frame];
}

이 메서드는 장치가 회전 할 때마다 호출되므로 셀은 항상 중앙에 배치됩니다.


0

화면이 회전 할 때 호출되는 메서드가 있습니다 : viewWillTransitionToSize

프레임 크기를 조정해야하는 곳입니다. 예를 참조하십시오. 필요에 따라 프레임 좌표를 변경하십시오.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        int x = 0;
        int y = 0;
        self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
    }];
}

-2

나는 그것을한다

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell;
    CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
    CGFloat tableBorderRight = self.view.frame.size.width - 20;

    CGRect tableRect = self.view.frame;
    tableRect.origin.x = tableBorderLeft; 
    tableRect.size.width = tableBorderRight; 
    tableView.frame = tableRect;
}

그리고 이것은 나를 위해 일했습니다.


-6

.h 파일에서 'UITableViewDataSource'대리자를 추가하십시오.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}

4
그는 폭이 아닌 높이를 설정하고자하는
크리스토퍼 Pickslay

오 후. 불편을 끼쳐 드려라.
bharath gangupalli

u는 질문을 오해하고 u는 높이에 대한 대답을하고 내가 너비가 아닌 높이를 검색하고 있기 때문에 그 일이 무엇인지 알고 있습니다. 대답을 주셔서 감사합니다
Pooja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.