iOS 는 UITableView 를 이용 하여 전체 화면 구분 선 을 설정 하 는 세 가지 방법 을 요약 합 니 다.
8583 단어 iosuitableview전체 화면 분리 선
본 고 는 주로 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];
}
}
이렇게 해서 단원 격 분할 선의 만 격 표시 가 실현 되 었 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.