objective-c – 从Landscape到Portrait(iPad)旋转后UITableView的奇怪行为

objective-c – 从Landscape到Portrait(iPad)旋转后UITableView的奇怪行为,第1张

概述我试图在方法中旋转后读取tableview的contentOffset willRotateToInterfaceOrientation:时间:.我使用UITableViewController和tableHeaderView中的搜索栏创建了一个示例. 场景1: 给定设备在纵向,我隐藏搜索栏 然后我将设备旋转到横向 之后,我希望不要看到UISearchbar和contentOffset保持不变. 我试图在方法中旋转后读取tablevIEw的contentOffset

willRotatetoInterfaceOrIEntation:时间:.我使用UItableVIEwController和tableheaderVIEw中的搜索栏创建了一个示例.

场景1:
给定设备在纵向,我隐藏搜索栏
然后我将设备旋转到横向
之后,我希望不要看到UISearchbar和contentOffset保持不变.

场景2:
给定设备在横向,我隐藏搜索栏
然后我将设备旋转为肖像
之后,我希望不要看到UISearchbar和contentOffset保持不变.

方案1按预期工作.场景2d出搜索栏,内容偏移为零

有人知道为什么ContentOffset是零吗?我希望它是44(搜索栏的高度).

有什么方法可以解决这个问题吗?你会怎么做?

////  VIEwController.m//  test//#import "VIEwController.h"@interface VIEwController ()@end@implementation VIEwController- (ID)initWithStyle:(UItableVIEwStyle)style{    self = [super initWithStyle:style];    if (self) {        // Custom initialization    }    return self;}- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    // Uncomment the following line to preserve selection between presentations.    // self.cleaRSSelectionOnVIEwWillAppear = NO;    // Uncomment the following line to display an Edit button in the navigation bar for this vIEw controller.    // self.navigationItem.rightbarbuttonItem = self.editbuttonItem;}- (voID)willRotatetoInterfaceOrIEntation:(UIInterfaceOrIEntation)toInterfaceOrIEntation duration:(NSTimeInterval)duration{    //is necessary to prevent showing searchbar    dispatch_async(dispatch_get_main_queue(),^{        double y = self.tableVIEw.contentOffset.y;        self.tableVIEw.contentInset = UIEdgeInsetsMake(-1*y,0);        NSLog(@"y %f",y);        NSLog(@"Begin offset %@",NsstringFromCGPoint(self.tableVIEw.contentOffset));    });}- (voID)vIEwDIDAppear:(BOol)animated{    self.tableVIEw.tableheaderVIEw = [[UISearchbar alloc] initWithFrame:CGRectMake(0,self.tableVIEw.frame.size.wIDth,44)];}#pragma mark - table vIEw data source- (NSInteger)numberOfSectionsIntableVIEw:(UItableVIEw *)tableVIEw{#warning Potentially incomplete method implementation.    // Return the number of sections.    return 0;}- (NSInteger)tableVIEw:(UItableVIEw *)tableVIEw numberOfRowsInSection:(NSInteger)section{#warning Incomplete method implementation.    // Return the number of rows in the section.    return 0;}- (UItableVIEwCell *)tableVIEw:(UItableVIEw *)tableVIEw cellForRowAtIndexPath:(NSIndexPath *)indexPath{    static Nsstring *CellIDentifIEr = @"Cell";    UItableVIEwCell *cell = [tableVIEw dequeueReusableCellWithIDentifIEr:CellIDentifIEr];    if (cell == nil) {        cell = [[UItableVIEwCell alloc] initWithStyle:UItableVIEwCellStyleDefault reuseIDentifIEr:CellIDentifIEr];    }    // Configure the cell...    return cell;}#pragma mark - table vIEw delegate- (voID)tableVIEw:(UItableVIEw *)tableVIEw dIDSelectRowAtIndexPath:(NSIndexPath *)indexPath{}@end
解决方法 我想我知道问题出在哪里:

UItableVIEw具有默认的自动调整遮罩.因此,在将设备从纵向旋转到横向之后,UItableVIEw变得越来越小(不会改变偏移).如果用户现在回到纵向,则需要拉伸UItableVIEw并自动滚动到顶部.为了解决这个问题,我使用了一个变量来注册每个“用户滚动”

> scrollVIEwWillBeginDragging(注册)
> scrollVIEwDIDEndDecelerating(unregistrate)
>在“scrollVIEwDIDScroll”中我检查滚动是否来自用户(如果来自用户保存偏移值)

最后在方法“willRotatetoInterfaceOrIEntation”中,我将临时保存的偏移量设置为UItableVIEw,以使其保持在同一位置.

我希望有更好的解决方案,因为我解决这个问题的方法有点棘手.

总结

以上是内存溢出为你收集整理的objective-c – 从Landscape到Portrait(iPad)旋转后UITableView的奇怪行为全部内容,希望文章能够帮你解决objective-c – 从Landscape到Portrait(iPad)旋转后UITableView的奇怪行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1079930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存