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

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

질문은 : 그룹화 된 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 일이 걸렸습니다. 이것이 남은 것입니다.



답변

이를 달성하는 더 좋고 깨끗한 방법은 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. 더 좁은 너비를 가짜로 만드는 사용자 지정 셀 렌더링

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


답변

변수를 설정하는 메서드를 제공하지 않는 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
    }
}


답변

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

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


답변

허용 된 솔루션이 회전시 작동하지 않음을 발견했습니다. 고정 너비 및 유연한 여백으로 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];
}

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


답변

화면이 회전 할 때 호출되는 메서드가 있습니다 : 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);
    }];
}


답변

나는 그것을한다

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

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


답변

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

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