如何制作浮动视图?

Posted

技术标签:

【中文标题】如何制作浮动视图?【英文标题】:How to make floating view? 【发布时间】:2016-07-14 09:48:44 【问题描述】:

我所说的浮动视图是自定义视图,它是滚动视图的子视图(或看起来是子视图),它一直滚动直到它锚定在某个点上。类似的行为将是 UITableView 的部分标题。下面附上图片

我的内容视图(浮动视图下方的视图)不在 tableview 布局中。这意味着如果我仅将 tableview 用于浮动视图,我必须将我的内容视图放在 1 个巨型单元格中,或者将其分成几个具有不同布局的单元格。内容视图将有很多动态元素,这就是为什么我不想把它放在 UITableViewCell 中,除非我必须这样做。我可以以编程方式制作浮动视图/在滚动视图上使用自动布局吗?

【问题讨论】:

这是一个主要基于意见的问题,请报告有关您问题的更多详细信息。 我也遇到过,我的经验是用auto layout好像不太好,有时会有一些延迟动画,我用的是KVO,好很多。顺便说一句,正如你所说,使用表格视图更容易 你说“我不需要页面的表格视图”,但从技术上讲,你已经排除了使用浮动部分标题的明显解决方案,并且没有显示任何努力提出任何其他解决方案,您只是在这里提出要求,让 someone else 和 somehow else 解决您的问题 - 这不是在这里提出问题的方式。 @holex 我的措辞很糟糕。我确实解释了为什么我不喜欢使用 tableview。我知道如何使用浮动部分标题,我想知道是否有更好的选择。我确实尝试过提出其他解决方案来征求建议,而之前的评论者认为这是一个基于意见的问题,这就是为什么我编辑直接提出“如何”问题。感谢您的建议,我是新来的,还在学习如何正确提问:) 【参考方案1】:

使用 tableview 部分标题可能是最好的解决方案,您始终可以轻松自定义单元格的数量或单元格本身以实现特定的布局。

但是,如果您绝对不想处理 tableview,这个组件看起来真的很酷,它实际上是要添加到 tableview 中的,但是我使用 twitter 示例对其进行了测试,您实际上可以将它添加到滚动视图,因此您不需要表格视图并且它会起作用,给制作它的人提供道具。 GSKStretchyHeaderView

希望对你有帮助,有问题可以评论,祝你好运。

【讨论】:

【参考方案2】:

使用 KVO 更新浮动视图的框架。

这是用 Objective-C 编写的示例代码:

// ScrollView.m
// ScrollView is a subclass of UIScrollView

@interface ScrollView ()

@property (nonatomic, strong) UIView *floatingView;
@property (nonatomic) CGRect originalBorderFrame;
@property (nonatomic) CGFloat anchorHeight;

@end

@implementation ScrollView


- (instancetype)initWithFrame:(CGRect)frame 
    self = [super initWithFrame:frame];

    if (self) 
        self.floatingView = [UIView new];
        self.floatingView.backgroundColor = [UIColor colorWithRed:0.8211 green:0.5 blue:0.5 alpha:1.0];
        self.floatingView.frame = CGRectMake(0, 150, frame.size.width, 20);
        self.originalBorderFrame  = self.floatingView.frame;
        [self addSubview:self.floatingView];

        self.anchorHeight = 44;

        [self addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
    

    return self;


- (void)dealloc 
    [self removeObserver:self forKeyPath:@"contentOffset"];


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context 
    if ([keyPath isEqualToString:@"contentOffset"]) 
        if (self.contentOffset.y > self.originalBorderFrame.origin.y-self.anchorHeight) 
            self.floatingView.frame = CGRectOffset(self.originalBorderFrame, 0, self.contentOffset.y - (self.originalBorderFrame.origin.y-self.anchorHeight));
        
    

@end

下面是截图:

【讨论】:

以上是关于如何制作浮动视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中制作简单的上下浮动动画?

如何为 FrameLayout 中的多个视图制作浮动上下文菜单?

如何在 Xamarin 表单中制作浮动操作按钮

如何在颤动中制作带有弹出菜单的浮动操作按钮?

如何制作像 envato 这样的浮动侧边栏?

如何制作一个只在android屏幕上浮动的粘性列表项?