我目前正在尝试将UITableView
放在不同的位置,而不是放在视图控制器的顶部。有了这个说,它试图在顶部添加标题以考虑导航栏,但这不是必需的,因为我没有在我的控制器的顶部。
如果我将UITableView
的左上角放在我想要的细胞所在的位置,它就不会将细胞放在那里:
现在,如果我只是向上移动表格视图以使单元格位于正确的位置,我会遇到一个不同的问题 - 滚动时单元格可以移动到那里(这是我的手指在导航控制器上方):
当我放手时,是的 - 细胞会在搜索栏的正下方,但这显然是一个问题,如何将它们带到它上面。
我将如何做到这一点?有没有更简单的方法?
答案 0 :(得分:370)
向下滚动时,UITableView
的单元格是否显示在空白区域?
如果是这样,那么问题可能是由于您在视图中使用的导航控制器而添加到UITableView
的插入内容。
将插入内容添加到表视图中,以便在未进行滚动时将内容放置在导航栏下方。滚动表格时,内容会滚动并显示在透明导航栏下。当然,只有当表视图直接在导航栏下面开始时才需要这种行为,这不是这里的情况。
另一件需要注意的事情是iOS仅针对视图层次结构中的第一个视图调整内容插入,如果它是UIScrollView
或它的后代(例如UITableView
和UICollectionView
)。如果您的视图层次结构包含多个滚动视图,automaticallyAdjustsScrollViewInsets
将仅对第一个进行调整。
以下是更改此行为的方法:
a)界面生成器
在IB的属性检查器中(当选择了视图控制器时),有一个名为“调整滚动视图插入”的属性,默认情况下处于打开状态。取消选中此选项:
(图片由Dheeraj D提供)
我不确定哪个Xcode版本引入了此选项(未在发行说明中发现),但它至少在5.1.1版本中可用。
编辑:为避免混淆,这是评论中提到的第三个选项
b)以编程方式
将此添加到viewDidLoad
( Slavco Petkovski 的答案和 Cris R 的评论)
// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;
// Swift
self.automaticallyAdjustsScrollViewInsets = false
c)这可能与老学生有关
您可以通过添加
来解决此问题tableView.contentInset = UIEdgeInsetsZero
//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero
或者,如果您正在使用IB并且导航栏不透明(无法从屏幕截图中看出)
答案 1 :(得分:70)
我遇到了同样的问题,我很确定我有一个UIView。只需复制整个表视图,删除它并再次粘贴就可以为我修复它。
答案 2 :(得分:31)
在故事板中选择tableview并确保样式设置为“Plain”,而不是“Grouped”。您可以在属性“检查器”选项卡中找到此设置。
答案 3 :(得分:9)
在我的案例中,我在视图层次结构中的UITableView下有一个UILabel。
我把它移动了#34;前进"并出现了空白区域。不知道为什么,但它的工作原理如下,如果在tableView下有任何东西,它会隐藏空白区域。
您也可以尝试检查/取消选中"调整滚动视图插图"在故事板上的视图控制器检查器上。
答案 4 :(得分:5)
上述任何一项都没有帮助我。但是这确实有帮助:
self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)
而不是'-64',您可以根据导航栏的高度放置任何其他数字。
答案 5 :(得分:4)
可能有预先添加的UIRefreshControl
。我有这样的代码的问题:
self.refreshControl = [[UIRefreshControl alloc] init];{
[self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
initWithString:@"Your string"]];
[self.refreshControl addTarget:self
action:@selector(updateScreen)
forControlEvents:UIControlEventValueChanged];
}
如您所见,我在self.refreshController
init
但是,如果您在设置后设置refreshControl
,那么顶部空间不会干扰您。
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];{
[self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
initWithString:@"Your String"]];
[self.refreshControl addTarget:self
action:@selector(updateScreen)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
}
答案 6 :(得分:3)
我仍然不确定是什么原因引起了顶部的额外空间,但我发现用空格删除UITableView并用新的空格替换它会占用空间。
我一定是在那里意外拖了一个UIView,但是我无法选择它所以我无法删除。
答案 7 :(得分:3)
答案 8 :(得分:3)
如果您在iOS 11上执行此操作,则selfAdjustsScrollViewInsets将无法使用,因为以下代码根据此帖中的答案为我工作:https://stackoverflow.com/a/44391269/5476481
if #available(iOS 11.0, *) {
tblView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
希望这有帮助。
答案 9 :(得分:3)
我不能肯定地说,但看起来你在原型单元开始的地方和UITableView的顶部之间有一个额外的UIView。如果您删除我添加的文本/行,我的图像看起来与您的图像完全一样。
答案 10 :(得分:2)
检查storyboard或xib中的tableview框架。 我默认有一个y位置值,因此错误
答案 11 :(得分:2)
在我的申请中,我也遇到过这样的问题。我已经设置了tableView零的上边缘插图。还尝试为simd
设置false
。但是没有用。
最后我得到了一个有效的解决方案。我不知道这是正确的方法。但实施automaticallyAdjustsScrollViewInsets
委托方法对我有用。你必须返回一个非零值来处理它(返回零将显示与以前相同的空格)。
heightForHeaderInSection
答案 12 :(得分:1)
只要UITableView不是视图控制器的第一个子视图,就不会出现空白区域。
解决方案:添加隐藏/清晰视图对象(视图,标签,按钮等)作为视图控制器的第一个子视图(与UITableView处于同一级别但在它之前)。
答案 13 :(得分:1)
在iOS 11及更高版本中,Apple更改了属性以调整内容插图。使用contentInsetAdjustmentBehavior
并将.never
设置为删除UICollectionView
,UIScrollView
,UITableView
上方的多余空间。
if #available(iOS 11.0, *) {
// For scroll view
self.scrollView.contentInsetAdjustmentBehavior = .never
// For collection view
self.collectionView.contentInsetAdjustmentBehavior = .never
// For table view
self.tableView.contentInsetAdjustmentBehavior = .never
} else {
self.automaticallyAdjustsScrollViewInsets = false
}
我希望这会对您有所帮助。
答案 14 :(得分:1)
2017年,对我有用的只是这一行
navigationController?.navigationBar.isTranslucent = false
我不知道为什么会影响它。也许有人可以解释。但我很确定这是大多数人想要的答案。
答案 15 :(得分:1)
我正在以编程方式执行此操作,并且在添加所有其他子视图后,我只是将addSubview(tableView)移动到底部,它解决了我的问题!
不确定为什么这只出现在设备而不是我的模拟器上,但无论哪种方式,至少有一个简单的解决方案!
答案 16 :(得分:1)
当我将原型单元格从菜单拖到表格视图中时,问题就出现了。所以我删除了它,只是在表视图检查器属性
中将原型单元格设置为1答案 17 :(得分:0)
可以在表格的顶部和底部插入UIView(拖放)。将其属性设置为透明,高度为1像素。这是为了去除单元格前面的额外填充。
答案 18 :(得分:0)
Xcode 8 bug ...
如果您的Storyboard UITableView样式设置为Plain,请先尝试此操作。
将表格的样式设置为Grouped,然后再返回Plain。 这删除了我的应用程序中UITableView头部的空间。
答案 19 :(得分:0)
就我而言,我正在使用ContainerViewController并将UITableViewController放入其中。删除ContainerViewController后。问题消失了。
答案 20 :(得分:0)
我刚刚找到了解决方案。
只需选择tableview和clic Editor - >安排 - >发送到前面
它对我有用,希望它能帮到你们所有人。
答案 21 :(得分:0)
I just found a solution for this.
In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away.
https://i.stack.imgur.com/vRNfV.png
答案 22 :(得分:0)
您可以将此代码用于正在创建表的viewDidLoad或viewDidAppear中:
// Remove blank space on header of table view
videoListUITableView.contentInset = UIEdgeInsetsZero;
// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);
// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];
答案 23 :(得分:0)
在我的情况下,我使用的是容器视图。(主视图 - > Contaner视图 - > UITableView)
我认为,顶部的额外空间就像设备通知栏的空间(显示时间的地方,电池)。我真的这么做,这不是假设。
我所做的是来自UI Builder:
答案 24 :(得分:0)
我也有这个问题,tableView不是层次结构中的最后一个视图。在我的情况下,我有一个上面的视图(即使它们没有相互重叠),所以我将它拖动到层次结构中的tableView上方,并使之成为它。
答案 25 :(得分:0)
在情节提要中设置ViewController的扩展边缘,以便取消选中underTopBar
属性。
答案 26 :(得分:0)
存在相同的问题。我通过将以下内容添加到viewDidLoad中解决了该问题。
self.extendedLayoutIncludesOpaqueBars = true
答案 27 :(得分:0)
尝试删除 tableHeaderView 和 tableFooterView
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)
答案 28 :(得分:-1)
检查
if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
答案 29 :(得分:-1)