【问题标题】:iOS: Add subview with a fix position on screeniOS:在屏幕上添加具有固定位置的子视图
【发布时间】:2012-12-01 20:05:19
【问题描述】:

如何修复屏幕上的子视图位置(尤其是在 UIScrollView 和 UITableView 中)?我认为在故事板中

[self.view addSubview:aSubView];

不再起作用了。

有什么想法吗?

编辑#1:我使用的是 UITableViewController,而不是简单的 UITableView。

编辑#2

CGRect fixedFrame = self.menuViewRelative.frame;
fixedFrame.origin.y = 0 + scrollView.contentOffset.y;
self.menuViewRelative.frame = fixedFrame;

menuViewRelative = [[UIView alloc] init];
menuViewRelative.backgroundColor = [UIColor grayColor];
menuViewRelative.frame = CGRectMake(0.0, 0.0, 320.0, 50.0);

[self.view addSubview:self.menuViewRelative];

【问题讨论】:

  • 请充实你的问题......我不明白你想要做什么。
  • 在 ios 6 中你可以在 xib 中使用约束
  • 我想修复子视图 (UIView) 的位置,这样它就不会随着 UITableView 的内容滚动。子视图应该固定在屏幕上..
  • 您将不应滚动的视图添加为滚动视图的同级。假设您的滚动视图或表格视图是视图/窗口XY 的子视图,只需将您的固定视图也添加为 XY 的子视图。
  • @Till:对不起,我忘了说这是一个 UITableViewController :S 对不起。有什么想法吗?

标签: ios xcode uiview position


【解决方案1】:

您可以将您的子视图添加到窗口中吗,例如:

[self.view.window addSubview:mySubView];

它对我有用。我在动态表格视图中添加了一个像素位置信息视图。

【讨论】:

    【解决方案2】:

    正如其他人所说,如果您不使用UITableViewController,这会更容易一些,但无论如何也没那么难。

    UITableViewUIScrollView 的子类,因此表视图的委托(在这种情况下是您的UITableViewController 实例)也将接收UIScrollViewDelegate 方法调用。您所要做的就是实现每次滚动偏移更改时调用的方法并调整“固定”视图的框架。

    类似这样的:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGRect fixedFrame = self.fixedView.frame;
        fixedFrame.origin.y = 20 + scrollView.contentOffset.y;
        self.fixedView.frame = fixedFrame;
    }
    

    将 20 替换为您希望它距表格视图顶部的点数。您仍然将self.fixedView 添加为self.view 的子视图,这将确保它看起来像是在表格视图上方的固定位置。


    编辑:使用您发布的代码,我猜您的版本应该是这样的:

    - (void)viewDidLoad {
        menuViewRelative = [[UIView alloc] init];
        menuViewRelative.backgroundColor = [UIColor grayColor];
        menuViewRelative.frame = CGRectMake(0.0, 0.0, 320.0, 50.0);
    
        [self.view addSubview:self.menuViewRelative];
    }
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
        CGRect fixedFrame = self.menuViewRelative.frame;
        fixedFrame.origin.y = 0 + scrollView.contentOffset.y;
        self.menuViewRelative.frame = fixedFrame;
    }
    

    【讨论】:

    • 试过这种方式,但它似乎不起作用(请查看我上面问题中的代码)。
    • 你把代码放在哪里了?在这个方法中你不应该有其他 4 行,它们应该留在你的 viewDidLoad 或者你曾经拥有它们的地方。我发布的方法确实有效,你只需要像我描述的那样使用它。
    • 查看我的答案的编辑,如果你这样说它会起作用。
    • 我在同一个方法中使用这 4 行,因为我需要知道什么时候 y
    • 你做错了。我回答了您的问题,您应该接受正确的答案,如果您有任何其他问题,请询问他们。我无法读懂你的想法。
    【解决方案3】:

    如果它是一个包含表格视图的简单视图控制器,[self.view addSubview:aSubView] 应该可以工作。但是如果它是一个表格视图控制器,它就不会工作。

    【讨论】:

    • 完全正确。它是一个 UITableViewController.. 但是我怎样才能修复子视图的位置呢?
    • 你不能。使用一个简单的 UIViewController 并添加一个 UITableView 作为子视图。然后按照常规的方式绑定数据源,填充数据等。完成后,您可以使用 [self.view addSubview:view]
    • 可以通过变通方法在表格视图中获取固定位置的项目。但这是不可取的。相反,修复视图控制器是正确的做法。
    【解决方案4】:

    可以通过将子(您的)视图从 UIScrollView 移动到滚动视图的超级视图来完成。

    这是一个简单的例子:
    将按钮放置/设置在滚动视图上(不在滚动视图内),如此快照中所示。并且还针对滚动视图的超级视图设置按钮约束(位置)。

    这里是参考。每个视图的位置层次结构快照。

    【讨论】:

      猜你喜欢
      • 2011-12-07
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      相关资源
      最近更新 更多