Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UIScrollView ScrollRectToVisible-不使用动画=是_Objective C_Ios_Uiscrollview_Animated - Fatal编程技术网

Objective c UIScrollView ScrollRectToVisible-不使用动画=是

Objective c UIScrollView ScrollRectToVisible-不使用动画=是,objective-c,ios,uiscrollview,animated,Objective C,Ios,Uiscrollview,Animated,我有一个包含按钮的UIScrollView。 当按下按钮时,我想使用scrollRectToVisible滚动到视图的底部 例如: 如果我将“动画”设置为“否”,则一切正常, 但如果我将其设置为“是”,我会看到非常奇怪的行为: 基本上,什么也没发生 如果我反复点击按钮,它可能会滚动几个像素, 或者可以一直滚动 但是如果我在按下按钮之前用手指手动滚动视图, 它有可能像预期的那样滚动到底部,但这不是一件确定的事情 我已经打印了_geScroll_Settings.contentSize,正如预期

我有一个包含按钮的UIScrollView。 当按下按钮时,我想使用scrollRectToVisible滚动到视图的底部

例如:

如果我将“动画”设置为“否”,则一切正常, 但如果我将其设置为“是”,我会看到非常奇怪的行为:

  • 基本上,什么也没发生
  • 如果我反复点击按钮,它可能会滚动几个像素, 或者可以一直滚动
  • 但是如果我在按下按钮之前用手指手动滚动视图, 它有可能像预期的那样滚动到底部,但这不是一件确定的事情
我已经打印了_geScroll_Settings.contentSize,正如预期的那样

我还尝试通过启动计时器来延迟对scrollRectToVisible的调用,但结果基本相同

scrollView相当普通。 我正在interface builder中创建它。 我在启动时动态地添加scrollView的内容,并适当地调整它的contentSize,但一切似乎都很好


有什么想法吗?

我敢打赌,scrollRectToVisible正在崩溃,因为可见区域无效(1x1),或者y偏移量刚好超出边界,您是否尝试过将其设置为scrollView可见区域的大小

CGRect rectBottom = CGRectZero;
rectBottom.size = myUIScrollView.frame.size;
rectBottom.origin.y = myUIScrollView.contentSize.height - rectBottom.size.height;
rectBottom.origin.x = 0;

[myUIScrollView scrollRectToVisible:rectBottom animated:YES];

对不起,我不能再帮你了,但我现在不在Mac电脑上,所以无法运行测试。上面的代码将创建一个精确大小的CGRect,该CGRect与scrollView可见部分的大小一致,而偏移量将是其中最后一个可见部分。

我遇到了类似的问题,包括“如果我将动画设置为否,则一切正常”部分

事实证明,在iOS 6上,UITextView会自动滚动最近的父UIScrollView,使光标在成为第一响应者时可见。在iOS 7上没有这样的行为。UIScrollView似乎被几乎同时调用scrollRectToVisible的两个调用弄糊涂了

在iOS 6上,我对scrollRectToVisible的显式调用大部分时间被忽略。它只会滚动以使UITextView的第一行可见(自动滚动),而不是像在iOS 7上那样滚动

要测试它,请在Xcode 5中创建一个新的单视图应用程序,将其部署目标设置为6.0,并使用下面的ViewController.m代码。在iOS 6.1模拟器中运行它,滚动以隐藏UITextView,然后点击屏幕上的任意位置。您可能需要重试几次,但在大多数情况下,它只会使第一行可见。如果重新启用“工作区定义”,UITextView将嵌入其自己的UIScrollView中,对scrollRectToVisible的调用将按预期工作。


我还没有弄明白这一点,但我必须完成它,所以我只是启动了一个计时器,并使用setContentOffset w/animated:NO.自己滚动它直到它位于正确的位置,但是:(有趣的是,我会尝试一下,但我很怀疑。我确实使用了更一般大小的矩形——例如滚动视图的宽度和高度大于一但小于滚动视图的高度,但没有什么不同。在内容大小的中间,也尝试了矩形,而不是在结尾。我会告诉你的。我不知道CGRectZero,谢谢!我刚刚回复你-我试过了,但没有成功。最后我用“动画:没有”和计时器自己制作了动画。无论如何,谢谢。我刚刚遇到了这个问题。除了scrollRectToVisible调用外,我花了大约2个小时查看了所有内容。
CGRect rectBottom = CGRectZero;
rectBottom.size = myUIScrollView.frame.size;
rectBottom.origin.y = myUIScrollView.contentSize.height - rectBottom.size.height;
rectBottom.origin.x = 0;

[myUIScrollView scrollRectToVisible:rectBottom animated:YES];
#import "ViewController.h"

//#define WORKAROUND

@interface ViewController ()
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UITextView *textView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTap)]];

    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
    self.scrollView.contentSize = CGSizeMake(320, 400);
    self.scrollView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:self.scrollView];

#ifdef WORKAROUND
    UIScrollView* dummyScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)];
    self.textView = [[UITextView alloc] initWithFrame:dummyScrollView.bounds];
    [dummyScrollView addSubview:self.textView];
    [self.scrollView addSubview:dummyScrollView];
#else
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(20, 280, 280, 100)];
    [self.scrollView addSubview:self.textView];
#endif

    self.textView.backgroundColor = [UIColor grayColor];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)viewTap
{
    if (self.textView.isFirstResponder) {
        [self.textView resignFirstResponder];
    }
    else {
        [self.textView becomeFirstResponder];
    }
}

- (void)keyboardWasShown:(NSNotification*)aNotification
{
#ifdef WORKAROUND
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.superview.frame, 0, -10) animated:YES];
#else
    [self.scrollView scrollRectToVisible:CGRectInset(self.textView.frame, 0, -10) animated:YES];
#endif
}

@end