iOS7에서 UITableViewStyleGrouped 스타일로 UITableView 상단에 추가 패딩이있는 이유는 무엇입니까?
iOS7부터는 UITableView
스타일이있는 내 상단에 추가 공간 이 있습니다 UITableViewStyleGrouped
.
다음은 예입니다.
tableview는 첫 번째 화살표에서 시작하고 설명되지 않은 35 픽셀의 패딩이있는 다음 녹색 헤더가 UIView
반환됩니다 viewForHeaderInSection
(섹션이 0 임).
누구든지이 35 픽셀의 양이 어디에서 오는지 설명 할 수 있으며 전환하지 않고 어떻게 제거 할 수 UITableViewStylePlain
있습니까?
나는 다음의 도움을 받았습니다.
YouStoryboard.storyboard> YouViewController> 속성 검사기> 선택 취소-스크롤보기 삽입 조정.
나는 그것을 조금 더 가지고 놀았고 이것이 tableView의 tableHeaderView = nil
.
내 tableView가 동적으로 나타나기 때문에을 tableHeaderView
숨기고 싶을 때 tableHeaderView
수행하는 대신 다음을 수행합니다 self.tableView.tableHeaderView = nil;
.
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
동적으로도 contentInset.top
사용하기 때문에 다소 임의적으로 설정하는 것보다이 솔루션이 더 좋습니다 contentInset.top
. 다시 계산할 때마다 추가 35px를 제거하는 것을 기억하는 contentInset.top
것은 지루합니다.
IOS 7의 경우 뷰 컨트롤러에서 테이블 뷰를 할당하는 경우 살펴볼 수 있습니다.
self.edgesForExtendedLayout = UIRectEdgeNone;
너의 문제는 내 것과 비슷해 보였다
최신 정보:
iOS 9.x의 Swift :
self.edgesForExtendedLayout = UIRectEdge.None
스위프트 3 :
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
에서 상속 된 contentInset
속성을 변경해보십시오 .UITableView
UIScrollView
self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
해결 방법이지만 작동합니다.
self.automaticallyAdjustsScrollViewInsets = NO;
시도, 당신은 그것을 처리 할 수 있습니다!
앱이 iOS7 이상을 실행 중인지 감지하고 테이블 뷰 대리자 (일반적으로 UIViewController 코드)에이 두 가지 메서드를 추가 할 수 있습니다.
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
이것은 우아한 해결책은 아니지만 나를 위해 작동합니다.
Swift 버전 :
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
원래 버그의 원인을 발견하고이를 보여주는 샘플 프로젝트를 만들었습니다. iOS7 버그가 있다고 생각합니다.
iOS7부터는 Grouped 스타일로 UITableView를 생성하지만 첫 번째 레이아웃에 델리게이트가 설정되지 않은 경우 델리게이트를 설정하고 reloadData를 호출하면 상단에 사라지지 않는 35px 공간이 있습니다.
버그를 보여주는이 프로젝트를 참조하십시오 : https://github.com/esilverberg/TableViewDelayedDelegateBug
24 번 줄이 활성 상태이면
[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];
상단에 추가 35 픽셀의 공간이 있습니다. 27 행이 활성 상태이고 24 행이 주석 처리 된 경우
self.tableView.delegate = self;
상단에 공간이 없습니다. 이는 tableView가 어딘가에 결과를 캐싱하고 델리게이트가 설정되고 reloadData가 호출 된 후 자체를 다시 그리지 않는 것과 같습니다.
"스크롤보기 삽입 조정"을 선택 취소하십시오.
또 다른 간단한 설명 ... XCode 6.1에서도 UIScrollViews
, UITextViews
및 UITableViews
. 의 상단에 세로 공백이 나타나는 버그가 있습니다.
때때로이 문제를 해결하는 유일한 방법은 스토리 보드로 이동하여 문제 컨트롤을 드래그하여 더 이상 페이지 의 첫 번째 하위보기 가되지 않도록하는 것 입니다.
( 이 방향으로 나를 알려준 Oded 에게 감사합니다 . 증상을 보여주고 수정하기 위해 몇 개의 스크린 샷을 추가하기 위해이 댓글을 게시하고 있습니다.)
Apple의 iOS7 용 전환 가이드에 따르면 스크롤보기의 콘텐츠 삽입이 자동으로 조정됩니다. automaticAdjustsScrollViewInsets 의 기본값 은 YES로 설정됩니다.
UITableView가있는 UIViewController는이 속성을 NO로 설정해야합니다.
self.automaticallyAdjustsScrollViewInsets = NO;
이것은 트릭을 할 것입니다.
편집 1 :
또한 시도해 볼 수 있습니다.
self.navigationController.navigationBar.translucent = YES;
이것은 또한 상단의 여분의 패딩을 제거합니다.
그룹화 된 TableView를 사용하는 동안 viewWillAppear에서 테두리가 잘리지 않도록 이것을 사용하십시오.
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
위의 많은 이전 답변이 너무 엉망입니다. Apple이이 예상치 못한 동작을 수정하기로 결정하면 향후 언제든지 중단 될 것입니다.
문제의 원인 :
a
UITableView
는 높이가 0.0 인 헤더를 좋아하지 않습니다. 하려는 것이 높이가 0 인 헤더를 갖는 것이라면 솔루션으로 이동할 수 있습니다.나중에 헤더에 0.0이 아닌 높이를 할당하더라도
UITableView
처음에는 높이가 0.0 인 헤더가 할당되는 것을 좋아하지 않습니다.
해결책:
그런 다음 가장 간단하고 안정적인 수정은 헤더 높이를 테이블 뷰에 할당 할 때 0이 아닌지 확인하는 것입니다.
다음과 같이 작동합니다.
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;
다음과 같은 경우 (일반적으로 스크롤 후) 문제가 발생할 수 있습니다.
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
스토리 보드 :
선택 취소 : Adjust Scroll View Insets
View Controller의 옵션에서
암호:
self.automaticallyAdjustsScrollViewInsets = false
Swift 3을 사용하는 iOS 10 용 솔루션입니다.
.NET Framework에서 다음 메서드를 구현하여 위쪽 및 아래쪽 패딩을 제거 할 수 있습니다 UITableViewDelegate
.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
제 경우에는 이것이 저에게 도움이되었습니다. ios6도 지원하고 있습니다.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
VC의 viewDidLoad에 다음을 추가하기 만하면됩니다.
self.automaticallyAdjustsScrollViewInsets = NO;
그래서 여기에서 모든 방법을 시도했지만 이번에는 아무도 도움이되지 않았습니다. 제 경우는 iOS 9에서 그룹화 된 테이블보기였습니다. 저는 이걸 왜 어떻게 찾았는지 잘 모르겠지만 저에게는 최소한 높이로 설정하는 tableViewHeader
것이 효과적이었습니다. 도움이되지 않았습니다. 정말 도움이되지 않았습니다.UIView
0.01
CGRectZero
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
Swift : iOS 같은 화면에서 "뒤로"를 클릭했을 때 스크롤보기에 테이블보기가있었습니다. 스크롤보기는 상단에 더 많은 공간을 차지합니다.
self.automaticallyAdjustsScrollViewInsets = false
뷰 컨트롤러가 스크롤 뷰 삽입을 자동으로 조정해야하는지 여부를 나타내는 부울 값입니다. 기본값은 true이며,보기 컨트롤러는 상태 표시 줄, 탐색 표시 줄 및 도구 모음 또는 탭 표시 줄에서 사용하는 화면 영역에 대한 응답으로 스크롤보기 삽입을 조정할 수 있습니다. 보기 계층 구조에 둘 이상의 스크롤보기가있는 경우와 같이 스크롤보기 삽입 조정을 직접 관리하려면 false로 설정하십시오.
@Aurelien Porte의 답변에 감사드립니다. 여기 내 해결책이 있습니다.
이 문제의 원인 :-
- UITableView는 높이가 0.0 인 헤더를 좋아하지 않습니다. 하려는 것이 높이가 0 인 헤더를 갖는 것이라면 솔루션으로 이동할 수 있습니다.
- 나중에 헤더에 0.0이 아닌 높이를 할당하더라도 UITableView는 처음에 높이가 0.0 인 헤더에 할당되는 것을 좋아하지 않습니다.
In ViewDidLoad:-
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
No Need For Something Like This :-
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
In heightForHeaderInSection
delegate:-
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
In viewForHeaderInSection
delegate :-
if section == 0
{
// Note CGFloat.min for swift
// For Objective-c CGFLOAT_MIN
let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min))
return headerView
}
else
{
// Construct your other headers here
}
I'm assuming that is just part of the new UITableViewStyleGrouped
styling. It is in all grouped table views and there doesn't seem to be any direct way to control that space.
If that space is being represented by a UIView
, it would be possible to search through all the subviews
of the UITableView
to find that specific view and edit it directly. However, there is also the possibility that that space is just a hardcoded offset before headers and cells start and there won't be any way to edit it.
To search through all subviews (I would run this code when the table has no cells, to make it a little easier to read the output):
- (void)listSubviewsOfView:(UIView *)view {
// Get the subviews of the view
NSArray *subviews = [view subviews];
// Return if there are no subviews
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSLog(@"%@", subview);
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}
My answer is going to be more general answer, but can be applied on this as well.
If the root view (of the ViewController) or the first child (subview) of the root view is subclass of the UIScrollView (or UIScrollView itself), and if
self.navigationController.navigationBar.translucent = YES;
framework will automatically set pre-calculated contentInset.
To avoid this you can do
self.automaticallyAdjustsScrollViewInsets = NO;
but in my case I wasn't able to do this, because I was implementing SDK which has UIView component which can be used by other developers. That UIView component contains UIWebView (which has UIScrollView as the first subview). If that component is added as the first child in the UIViewController's view hierarchy, automatic insets will be applied by system.
I've fixed this by adding dummy view with frame (0,0,0,0) before adding UIWebView.
In this case system didn't find subclass of the UIScrollView as the first subview and didn't apply insets
This is how it can be fixed easily in iOS 11 and Xcode 9.1 through Storyboard:
Select Table View > Size Inspector > Content Insets: Never
I had the same fix as arielyz. Once I moved the UITableView to be not the first subview of the parent view, it went away. My space was 20 px, not 35.
I wasn't able to recreate it in a portrait xib, only a landscape xib. I'll file a radar bug later if I can reproduce it in a simple demo app.
I think making UIEdgeInsets -35 0 0 0 is tedious. In my case, I implemented tableView: heightForHeaderInSection: method and it has a potential to return 0.
When I changed 0 to 0.1f, the problem just went away.
use this one i think this help...
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None
// OR
self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
//OR
self.automaticallyAdjustsScrollViewInsets = false
}
The only thing that worked for me was:
Swift:
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
Objective-C:
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
Also, I still had an extra space for the first section. That was because I was using the tableHeaderView
property incorrectly. Fixed that as well by adding:
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
We have multiple answers for this.
1) You can add UIImageview at view didload
UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];
2) You can set header and footer height 0.1
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
3) You can add header and footer view with height 0.1
tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
Swift 4 code: For tableview with no section headers you can add this code:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
and you will get the header spacing to 0.
If you want a header of your specific height pass that value:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
and the view from viewForHeaderinSection delegate.
To be specific, to remove tableviewHeader space from top i made these changes:
YouStoryboard.storyboard> YouViewController> TableView 선택> 크기 검사기> 콘텐츠 삽입-없음으로 설정합니다.
'Program Tip' 카테고리의 다른 글
INotifyPropertyChanged 구현-더 나은 방법이 있습니까? (0) | 2020.10.02 |
---|---|
Java에서 폴더의 모든 파일을 읽는 방법은 무엇입니까? (0) | 2020.10.02 |
분기는 어떻게 만듭니 까? (0) | 2020.10.02 |
pip로 설치된 패키지 버전 찾기 (0) | 2020.10.02 |
오류 : 클라이언트로 보낸 후 헤더를 설정할 수 없습니다. (0) | 2020.10.02 |