将视图拆分为两个

时间:2011-08-04 17:25:09

标签: objective-c ipad

我对使用的词汇不太熟悉,但我会尽力解释我想要做的事情。

我想创建一个iPad应用程序,它有一个导航控制器作为根控制器(是的,我知道这违反了Apples关于创建扁平层次结构的建议)。当应用加载时,用户将输入一些信息,然后按“下一步”按钮。我知道如何创建创建导航控制器,这是下一页我遇到困难的时候。

在下一页上,我试图创建一个分为两半的视图(不是SplitViewController)。左侧是视图控制器,右侧是另一个视图控制器(两者相互独立)。类似于有两个iframe的网站。

有人可以指出我正确的方向吗?我真的不确定要搜索什么。

2 个答案:

答案 0 :(得分:2)

如果UISplitViewController不会剪切它或者因为你在iPhone上而无法使用它,有很多不同的方法可以做到这一点:

  1. 创建一个父控制器,用于分配/插入两个子视图控制器,然后将其视图添加为子视图。这是我在需要时使用的方法,但我应警告Apple在Note section of the View Controller Programming Guide
  2. 中提出反对意见
  3. 创建一个负责说左侧的parentController,但是它分配/进入负责右侧的子viewController并将其视图添加为子视图。同样的警告,Apple建议反对它。
  4. 与上面类似,但使用Apple推荐的方法让您的子控制器子类NSObject而不是UIViewController。这是a good blog post on the subject
  5. 将它们全部集中到一个负责一切的怪物viewController中。如果你继承旧的iOS代码(在我看来是最糟糕的),这是你会发现最常用的方法。
  6. 我个人更喜欢第一种,第二种或第三种方法,因为它可以更好地分离关注点,良好的封装,以及更清晰,更易于维护的代码。我还发现,如果我们改变流程以从分割样式视图移动到两个不同的屏幕,那么各个viewControllers完全可以重复使用,因为它们被很好地封装了。

答案 1 :(得分:0)

我制作了TUSplitSyncScrollView,如下图所示。

enter image description here enter image description here enter image description here

在这段代码中,我使用KVO来观察另一个窗口的行为,如下所示:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
{
    if (keyPath == @"observedPresentScale") {
        // 自身のzoomScaleに監視しているobservedPresentScaleの値を代入する
        // まず拡大縮小可能にする
        self.maximumZoomScale = 1000.0;
        self.minimumZoomScale = 0.001;
        self.zoomScale = [change[@"new"] floatValue];
        // ここで拡大縮小禁止にする
        self.maximumZoomScale = self.zoomScale;
        self.minimumZoomScale = self.zoomScale;
        printf("zoomScale = %f\n", self.zoomScale);
    }
    else if (keyPath == @"observedContentOffsetY") {
        self.contentOffset = CGPointMake(self.contentOffset.x, [change[@"new"] floatValue]);
    }
}

两种观点互相观察。

int opt = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew;

// rightSplitedScrollViewをleftSplitedScrollViewのオブザーバにする
[leftSplitedScrollView addObserver:rightSplitedScrollView forKeyPath:@"observedPresentScale" options:opt context:NULL];
[leftSplitedScrollView addObserver:rightSplitedScrollView forKeyPath:@"observedContentOffsetY" options:opt context:NULL];

// leftSplitedScrollViewをrightSplitedScrollViewのオブザーバにする
[rightSplitedScrollView addObserver:leftSplitedScrollView forKeyPath:@"observedContentOffsetY" options:opt context:NULL];
//    [rightSplitedScrollView addObserver:leftSplitedScrollView forKeyPath:@"observedPresentScale" options:opt context:NULL];

您可以从此处运行实际项目:https://github.com/weed/TUSplitSyncScrollView