1

编辑:2013 年 1 月 12 日

重复(已回答)问题演示项目的源代码已更新以反映。
我很想将这个问题标记为已关闭,并提供一个适当的“复制”链接,但我两者都没有声誉。我是个多么可悲的小人...


免责声明:这是一个可能过于复杂的观点,我正在研究可能被误导的意图。我非常愿意接受这样的可能性,即我错过了完成这项工作所需的一些关键信息/诀窍,试图做一些 iOS 根本不会做的事情,或者我做错了。如果是这种情况,我会很乐意接受一个让我信服的答案,或者只是把一本文档/厚重的书扔在我的头上,上面有我可能会去 RTFM 的页码。

一般问题

对于较大应用程序中的一个视图,我试图向用户呈现一个包含四个主要元素的垂直滚动屏幕。从上到下列出,它们如下;一些关于事物的一般信息(一个 UITextView)、一个相关的 Stuff 列表(一个 UITableView,因为每个都代表实际应用程序中的一个潜在的 segue)、一些更多信息(在示例中是一个 UILabel)和一个可操作的按钮(一个按钮)。TableView 中相关 Stuff 的单元格数量取决于所呈现的事物是什么。所以我想出了一种方法来调整 tableView 的大小并相应地移动 UILabel 和 UIButton (详细如下,在viewDidAppear:)。这一切都很好,花花公子,滚动并让我开心,但是当我按下按钮时,它跳回到它在 Interface Builder 视图中占据的位置,完全无视我对其框架的编程更改。

问题

为什么?
可以修复(如果可以,如何修复)?
有不同的和/或更好的方法吗?

我想发布一些图片来展示到底发生了什么,但我没有声誉,所以有一个演示项目的完整来源(见上文)。随意摆弄代码,看看发生了什么。

所有细节

(请随意跳过这些)
我在 Interface Builder(和代码中)中整理的屏幕组织如下:

View Controller -- Doing what it does.
* UIView -- Used to set a static background.
  * UIScrollView -- Sized to the parent view, used for scrolling
    * UIView -- Width equal to ScrollView, height is arbitrarily large (1200 in my project)
                We shall call him "subScrollView"
      * Content
      * More Content

我必须在我的 ViewController 的viewDidAppear:方法中执行内容视图的大小/位置更改,因为尽快进行更改不会使其通过实际呈现的视图。
我需要(或只是拥有?)subScrollView 的原因是,如果我所有的内容视图都是 ScrollView 的子视图,那么只要发生滚动,就会出现上述问题——例如,视图出现、表格调整大小、按钮移动,然后用户滚动场景,表格恢复到在 Interface Builder 中给定的大小,按钮移回其原始位置。

这是我用来调整内容视图的代码:

为什么EvenViewController.h

@interface whyEvenViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UILabel *wasteMoreSpaceLabel;
@property (weak, nonatomic) IBOutlet UIButton *aButton;

@property (nonatomic) NSInteger tableViewRowCount;

@end

为什么EvenViewController.m

- (void)viewDidAppear:(BOOL)animated
{
    // Here's where we resize and move everything. If we attempt to make these
    // changes before this (e.g. in viewDidLoad, viewWillAppear:, or even
    // viewDidLayoutSubviews) they get changed back before this view transitions
    // onto the screen, be it from a Navigation Bar push, or opening the app.

    [super viewDidAppear:animated];

    // Get used to this guy. He's going to be helping us resize frames.
    CGRect newFrame;

    // Set the tableView's frame height to the height of its contentSize which
    // so the entire table (no mater how large it is) is visible.
    newFrame = self.tableView.frame;
    newFrame.size.height = self.tableView.contentSize.height;
    self.tableView.frame = newFrame;

    // Move the wasteMoreSpaceLabel to just below the tableView
    newFrame = self.wasteMoreSpaceLabel.frame;
    newFrame.origin.y = self.tableView.frame.origin.y + self.tableView.frame.size.height - 20;
    self.wasteMoreSpaceLabel.frame = newFrame;

    // Move aButton to just below the wasteMoreSpaceLabel
    newFrame = self.aButton.frame;
    newFrame.origin.y = self.wasteMoreSpaceLabel.frame.origin.y + self.wasteMoreSpaceLabel.frame.size.height + 8;
    self.aButton.frame = newFrame;

    // Set the size of the scroll view such that it ends 20 points below aButton.
    CGSize newSize = self.scrollView.contentSize;
    newSize.height = self.aButton.frame.origin.y + self.aButton.frame.size.height + 20;
    self.scrollView.contentSize = newSize;
}

感谢您爬下这堵文字墙,感谢您的时间。

4

0 回答 0