UIView - UIScrollView 奇怪的行为

Posted

技术标签:

【中文标题】UIView - UIScrollView 奇怪的行为【英文标题】:UIView - UIScrollView odd behaviour 【发布时间】:2013-12-19 14:30:45 【问题描述】:

我有一个名为MenuViewControllerUIViewController,我在其中创建了一个UIView MessageView 并将其传递给NSString

MessageView *mess = [[MessageView alloc]initWithFrame:CGRectMake(0, 0, 1024, 768)];
[mess messageString:@"A:text\nM:text\nA:text\nM:text"];
[self.view addSubview:mess];

MessageView 中,我正在创建一个UIScrollView 和几个UILabels;我的问题如下,我无法理解行为:

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self)
    
        scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(540, 50, 360, 160)];
        scrollView.backgroundColor = [UIColor redColor];
        [self addSubview:scrollView];
    
    return self;


- (void)messageString:(NSString *)string

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height/6)];

   >>>>> HERE is the problem <<<<<<

    if i try to add label to scrollView it does not appear
    [scrollView addSubview:label];

    if i try to add label to self it appears
    [self addSubview:label];

我想在 MessageView 中创建我想在此处显示的所有内容,然后从视图控制器中调用它。有人知道可能是什么问题吗?

【问题讨论】:

当你设置一个视图的框架时,它应该在superview的坐标系中。因此,如果您将标签添加为滚动视图的子视图,则标签 init 方法应在标签的框架计算中使用 scrollView.bounds,而不是 scrollView.frame。还有一点需要注意:最好将 messageString 重命名为 setMessageString,因为以前的样式用于 getter,而不是 setter。 你能看到你的滚动视图吗?我在你的问题中看到滚动视图的 x 位置是 540 【参考方案1】:

这一行:

UIImageView *label = [UILabel alloc]initWithFrame:CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height/6)];

应该产生错误和警告。一方面,您缺少一个起始括号[,最重要的是,您正在创建一个指向 UIImageView 对象的指针,然后为其分配一个标签。用这样写的那行再试一次:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height/6)];

这当然是假设该方法甚至被调用,并且滚动视图是非 nil 并且在您尝试访问它时具有适当的框架。

【讨论】:

这是我的错误,我从messageString中删除了大部分代码以便更容易理解。【参考方案2】:

您在滚动视图的可见框架之外添加标签:替换

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(scrollView.frame.origin.x, scrollView.frame.origin.y, scrollView.frame.size.width, scrollView.frame.size.height/6)];

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0,0, scrollView.frame.size.width, scrollView.frame.size.height/6)];

【讨论】:

以上是关于UIView - UIScrollView 奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

垂直空间约束奇怪的行为

contentOffset 在 UIScrollView 缩放结束时重置

拖动包含 UIScrollView 的 UIView

ios: uiscrollview 和 uiview 自动布局

为啥我在 UIScrollView 中的 UIView 不滚动?

UIScrollView - 无法查看所有 UIView