在尝试保留子视图的位置时滚动NSScrollView

时间:2014-04-17 14:24:24

标签: objective-c macos cocoa autolayout nsscrollview

我有一个NSScrollView的子类。在该scrollView的documentView中,我有几个NSView。最后,我将一个名为 aView 的NSView添加到documentView。

我希望 aView 位于documentView的底部,只要不需要滚动即可。只能沿y轴滚动。

如果documentView对于contentView来说太高了 - 所以需要滚动 - 我希望 aView 显示在contentView的底部。

这适用于您在下面看到的代码。

这是我的问题: 我开始滚动的那一刻,我希望 aView 保留在contentView的底部,但 aView 只需滚动显示documentView中的所有其他视图。 换句话说:如果需要滚动,我希望将 aView的位置固定在我的scrollView的可见rect的底部,如果contentView为高,则将其固定在documentView的底部足以显示整个documentView。

有办法吗?我哪里出错?

这是我的子类NSScrollView中的代码:

    [documentView addSubview:aView];

    aView.translatesAutoresizingMaskIntoConstraints = NO;

    NSLayoutConstraint *documentAViewBottom = [NSLayoutConstraint constraintWithItem:documentView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:aView attribute:NSLayoutAttributeBottom multiplier:1 constant:0];
    documentAViewBottom.priority = NSLayoutPriorityDefaultHigh;
    [documentView addConstraint:documentAViewBottom];

    NSLayoutConstraint *aViewMaxYEdge = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:aView attribute:NSLayoutAttributeBottom multiplier:1 constant:5];
    [self addConstraint:aViewMaxYEdge];

    [documentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[aView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(aView)]];

1 个答案:

答案 0 :(得分:2)

我有点老了,NSLayoutConstraints对我没有吸引力,所以这是另一个提议的手动解决方案

设置文档视图时

从NSScrollView的子类

[self.contentView setPostsBoundsChangedNotification:YES];

然后订阅更改的边界

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentViewDidScroll:)
                                                     name:NSViewBoundsDidChangeNotification object:self.contentView];

然后在

-(void)contentViewDidScroll
{
    double widthOfAView = aView.frame.size.width;
    double heightOfAView = aView.frame.size.height;
    [aView setFrameOrigin:NSMakePoint(NSMinX(self.contentView.bounds) - widthOfAView, NSMaxY(self.contentView.bounds) - heightOfAView)];
}

所有这一切都假设您的isFlipped被覆盖为YES,当然。