iOS 는 UITableView 를 이용 하여 전체 화면 구분 선 을 설정 하 는 세 가지 방법 을 요약 합 니 다.

머리말
본 고 는 주로 iOS 가 UITableView 로 전체 화면 구분 선 을 설정 하 는 세 가지 방법 을 정리 했다.일반 TableView 는 전체 화면 구분 선 을 설정 하 는 데 다음 과 같은 세 가지 방법 이 있다.
1.셀 사용자 정의,분할 선 수 동 추가
자기 소유 의 를 숨긴다

tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
addSubview 방식 으로 분할 선 을 추가 할 수 있 습 니 다.분할 선 을 직접 그 릴 수도 있 습 니 다.

//      
- (void)drawRect:(CGRect)rect
{
 CGContextRef context = UIGraphicsGetCurrentContext();

 CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
 CGContextFillRect(context, rect);

 CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0xE2/255.0f green:0xE2/255.0f blue:0xE2/255.0f alpha:1].CGColor);
 CGContextStrokeRect(context, CGRectMake(0, rect.size.height - 1, rect.size.width, 1));
}
2.cell 을 다시 쓰 는 setFrame 방법,높이-1,배경 색 노출

- (void)setFrame:(CGRect)frame
{
 frame.size.height -= 1;
 //  cellframe  
 [super setFrame:frame];
}
시스템 분할 취소
tableView 배경 색 을 분할 선 색 으로 설정 합 니 다.

//        
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
//   tableView   
self.tableView.backgroundColor = [UIColor colorWithWhite:215 / 255.0 alpha:1];
3.시스템 속성 설정(separatorInset,layoutMargins)을 이용 하여 세 개의 코드 를 추가 해 야 합 니 다.
tableView 의 separatorInset,layoutMargins 속성 설정

-(void)viewDidLoad {
 [super viewDidLoad];
 //1.  (iOS7  )       
 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
 self.tableView.separatorInset = UIEdgeInsetsZero;
 }
 //2.  (iOS8  )view  (   cell   preservesSuperviewLayoutMargins,    )
 if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
 self.tableView.layoutMargins = UIEdgeInsetsZero;
 }
}
cell 의 LayoutMargins 속성 설정
cell 에 대한 설정 은 cell ForRow AtIndexPath 에 쓸 수도 있 고,will DisplayCell 방법 에 쓸 수도 있 습 니 다.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 static NSString *ID = @"cell";
 FSDiscoverSpecialCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
 if (cell == nil) {
 cell = [[FSDiscoverSpecialCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
 }

 //2.  (iOS8  )tableView  (    2   ,     )
 if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
 cell.preservesSuperviewLayoutMargins = NO;
 }
 //3.  (iOS8  )view  
 if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
 [cell setLayoutMargins:UIEdgeInsetsZero];
 }
 return cell;
}
세 가지 방법의 장단 점 비교:
방법 1 은 비교적 쓰기 좋 지만 어떤 경우 에는 시스템 이 자체 적 으로 가지 고 있 는 cell 만으로 도 충분 합 니 다.구분자 만 을 위해 서 는 cell 을 사용자 정의 하고 view 를 추가 하 며 배경 색 과 frame 을 설정 해 야 합 니 다.
방법 2 는 비교적 교묘 하지만 셀 을 사용자 정의 해 야 한다.어떤 경우 에는 tableView 의 배경 색 을 바 꿀 수 없고 사용 장면 이 제한 되 어 있다.
방법 3.사용자 정의 cell 이 필요 없 이 시스템(iOS 7,iOS 8 이상)에 대해 간단 한 판단 을 하면 됩 니 다.안 타 깝 게 도 인터넷 에 많은 글 들 이 잘못 쓰 여 있어 서 많은 사람들 이 정확하게 사용 하지 못 하고 사용 할 줄 아 는 사람들 도 원 리 를 잘 모 르 고 복사 붙 여 넣 기만 합 니 다.
예 를 들 어 인터넷 에 떠 도 는 것 은 보통 이 렇 습 니 다.네 걸음 이 필요 합 니 다.정말 효과 가 있 지만 한 걸음 더 많아 졌 습 니 다.[cell setSeparatorInset:UIEdgeInsets Zero];그리고 원리 도 말 하지 않 았 습 니 다.아마 어떤 큰 신 이 쓴 것 같 습 니 다.너무 많은 설명 을 할 가치 가 없어 서 저 는 사용 하기 가 답답 합 니 다.인터넷 에 코드 가 떠 돌 았 습 니 다.
우선 view DidLoad 방법 에 다음 과 같은 코드 를 추가 합 니 다.

-(void)viewDidLoad {
 [super viewDidLoad];
 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
 [self.tableView setSeparatorInset:UIEdgeInsetsZero];
 }
 if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
 [self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
그리고 윌 디 스 플레이 셀 방법 에 다음 코드 를 추가 합 니 다.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
 if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
 [cell setSeparatorInset:UIEdgeInsetsZero];
 }
 if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
 [cell setLayoutMargins:UIEdgeInsetsZero];
 }
}
사실 분리 선 이 전체 화면 에 나타 나 지 않 는 원리 에 대해 애플 은 공식 적 으로 문서 에 설명 되 어 있 으 니 가서 볼 수 있다.
iOS 7 이전에 시스템 은 기본적으로 전체 화면 이 었 습 니 다.iOS 7 때 UITableView 에 separatorInset 속성 이 많아 졌 습 니 다.UITableView 의 헤더 파일 에서 볼 수 있 습 니 다.다음 과 같 습 니 다.

@property (nonatomic) UIEdgeInsets separatorInset NS_AVAILABLE_IOS(7_0) UI_APPEARANCE_SELECTOR; 
// allows customization of the frame of cell separators
iOS 7 시 이 속성 을 UIEdgeInsetsZero 로 설정 하면 문제 가 없습니다.
iOS 8 이후 위 설정 만 완료 하면 안 됩 니 다.자세히 살 펴 보 니 iOS 8 의 UIView 헤더 파일 에 layoutMargins 속성 이 하나 더 있 고 공식 설명 이 있 습 니 다.

@property (nonatomic) UIEdgeInsets layoutMargins NS_AVAILABLE_IOS(8_0);
/*
 -layoutMargins returns a set of insets from the edge of the view's bounds that denote a default spacing for laying out content.
 If preservesSuperviewLayoutMargins is YES, margins cascade down the view tree, adjusting for geometry offsets, so that setting the left value of layoutMargins on a superview will affect the left value of layoutMargins for subviews positioned close to the left edge of their superview's bounds
 If your view subclass uses layoutMargins in its layout or drawing, override -layoutMarginsDidChange in order to refresh your view if the margins change.
 */
대 의 는 layoutMargins 는 view 의 bounds 의 여백 으로 내용 의 기본 여백 을 조정 하 는 데 사용 된다 는 것 이다.
preserves Superview LayoutMargins 속성 이 YES 라면 부모 컨트롤 의 layoutMargins 간격 을 설정 하면 모든 하위 컨트롤 의 부모 컨트롤 bounds 에 비해 layoutMargins 간격 에 영향 을 줄 수 있 습 니 다.
만약 view 의 하위 클래스 가 레이아웃 이나 그림 에 layoutMargins 속성 을 사용 했다 면,-layoutMargins DidChange 방법 을 다시 써 야 합 니 다.도시락 간격 이 바 뀌 었 을 때 view 를 새로 고 칠 수 있 습 니 다.
바로 layoutMargins 는 UIView 의 추가 속성 이기 때문에 tablet 과 cell 은 UIView 의 하위 클래스 로 서 모두 이 속성 을 가지 고 있 기 때문에 iOS 7 시스템 과 비교 하면 iOS 8 이후 두 단계 가 더 많아 졌 습 니 다.table View 와 cell 의 layoutMargins 속성 을 동시에 처리 해 야 구분자 가 전체 화면 을 바로 잡 을 수 있 습 니 다.
또한 공식 주석 에서 preserves Superview LayoutMargins(즉,부모 컨트롤 의 레이아웃 간격 유지)속성 에 대한 설명 은 인터넷 의 다른 방법 이 설정 되 지 않 고 설정 되 어 있 음 을 설명 할 수 있다self.tableView.layoutMargins = UIEdgeInsetsZero;이런 원 리 를 알 게 되면 이런 방법 을 더욱 잘 기억 하고 사용 할 수 있 습 니 다.매번 낡은 코드 를 찾 거나 바 이 두 를 찾 지 않 아 도 됩 니 다.
마지막 으로 말 했 는데,분리 선 전체 화면 에 영향 을 미 치 는 원흉 layout Margins 속성 이 조금 낯 이 익 지 않 나 요?사실 그것 은 다른 곳 에서 도 많은 악 을 저 질 렀 다.바로 story board 에서:

PS:효과 도 는 다음 과 같 습 니 다.
설정 전 효과 맵:

1 단계 설정 후 효과 그림:

2 단계 설정 후 효과 그림:

3 단계 설정 후 효과 그림:

첨부:UITableView 의 셀 분할 선 을 화면 에서 좌우 로 0 으로 설정 합 니 다.
개발 과정 에서 가끔 은 인터페이스의 미관 을 위해 그림 의 분할 선 좌우 간격 이 0,즉 아래 의 효 과 를 나타 내야 한다.
가끔 은 표 보기 의 분할 선 을 직접 취소 한 다음 에 셀 에 직선 을 직접 추가 하면 요 구 를 만족 시 킬 수 있 습 니 다.그리고 표 보기 내부 의 분할 선의 오프셋 을 바 꾸 어 실현 하 는 방법 도 있 습 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.

if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) { 
    [_tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)]; 
  } 
   
  if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { 
    [_tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)]; 
  } 

//     
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
  if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { 
    [cell setSeparatorInset:UIEdgeInsetsZero]; 
  } 
   
  if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { 
    [cell setLayoutMargins:UIEdgeInsetsZero]; 
  } 
} 
이렇게 해서 단원 격 분할 선의 만 격 표시 가 실현 되 었 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기