将 UIImageView 对齐到 UIScrollView 的底部

Posted

技术标签:

【中文标题】将 UIImageView 对齐到 UIScrollView 的底部【英文标题】:Align UIImageView to bottom of UIScrollView 【发布时间】:2014-12-07 01:09:28 【问题描述】:

我想在滚动视图的底部对齐红色图像。在纵向时它看起来很好,因为滚动视图的高度等于视图高度。

但是在横向模式下它看起来像这样,在横向模式下我希望它完全隐藏,直到用户滚动到滚动视图的底部,以便红色图像始终位于滚动视图的底部。目前它在横向模式下看起来像这样。

我添加了红色图像作为滚动视图的子视图,并对其应用了bottommarginautoresizingmask。

【问题讨论】:

设置自动布局/自动调整大小。 我已经在使用 autoreszingmask 下边距 不仅是下边距,还需要灵活的宽高左右蒙版 这不起作用,这就是我发布这个问题的原因 @hariszaman 如果您使用自动布局,那么问题将很容易解决,否则您必须明确设置框架才能在正确的位置显示视图。 【参考方案1】:

如果您使用autoresizing,则需要将leftrightbottomflexibleWidth 掩码设置为UIImageViewUIScrollView。看看这里附上的图片。

如果您的UIScrollView 覆盖整个屏幕,则为it 设置所有调整大小的遮罩,但为​​UIImageView 设置上述遮罩。

希望对你有帮助。

模拟器输出:

【讨论】:

【参考方案2】:

Autoresizingmask 在您使用自动布局时不起作用。 AutoLayout 将关闭从情节提要文件解码的视图的translatesAutoresizingMaskIntoConstraints。但是,如果您愿意,您仍然可以在代码中将其设置为 YES。但我不建议你这样做。如果您想保持简单和优雅,请坚持使用 AutoLayout。你应该做的是使用 AutoLayout 来布局图像视图。

您想在这里做的事情不能只在 IB 中完成。基于边缘的 AutoLayout 布局视图。在您的情况下,图像视图和滚动视图之间的关系在纵向和横向方向上是不同的。在纵向中,图像视图的底部边缘与滚动视图的底部边缘对齐。但在横向中,图像视图的顶部边缘与滚动视图的底部边缘对齐。没有办法只使用一组约束来实现您的目标。您可以在 IB 中向图像视图添加一个约束,将图像视图的底部边缘与滚动视图的底部边缘对齐,就像您问题中的第一张图片一样。然后IBOutlet 约束到您的视图控制器。当设备的方向改变时,你可以改变约束的常数。是这样的:

@interface ViewController ()

@property (nonatomic, weak) UIImageView *imageView; // the image view
@property (nonatomic, weak) NSLayoutConstraint *imageBottomToScrollView; // the constraint you added in IB to the image view

@end

@implementation ViewController


- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(orientation)) 
        self.imageBottomToScrollView.constant = -CGRectGetHeight(self.imageView.frame);
     else if (UIDeviceOrientationIsPortrait(orientation)) 
        self.imageBottomToScrollView.constant = 0;
    



@end

很简单~

【讨论】:

感谢您的回答,我已经使用编码完成了这项工作,但按照说明,我正在寻找仅界面构建器的解决方案 @hariszaman 只能在 IB 中完成。一些布局任务必须在代码中完成。【参考方案3】:

只需在视图控制器中添加此方法即可。

-(void)viewWillLayoutSubviews

    [super viewWillLayoutSubviews];
    CGSize contentSize = self.scrollView.contentSize;
    CGRect frame = self.imageView.frame;
    frame.origin.x = 0;
    frame.size.width = self.scrollView.frame.size.width;
    frame.size.height = Expected_Height;
    frame.origin.y = contentSize.height - frame.size.height;
    self.imageView.frame = frame;

【讨论】:

为什么?提问者使用的是autoresizingmask,所以这是唯一的方法。 我刚刚引用了注释。 啊,抱歉我没注意到。【参考方案4】:

Autoresizingmask 不适用于自动布局,在您的 IB 中,在图像上添加顶部空间约束,它将在滚动视图结束时显示您的图像。

【讨论】:

【参考方案5】:

您不能仅使用 IB 解决“问题”,因为您必须根据方向更改滚动视图的内容大小。如果您希望图像视图与标签栏重叠,则必须手动将滚动视图的内容大小设置为等于screen_height + abs(tabbar_height - imageview_height)

【讨论】:

【参考方案6】:

您必须将 uiimageview 固定到滚动视图的底部,它会考虑到 contentSize。希望有帮助

【讨论】:

以上是关于将 UIImageView 对齐到 UIScrollView 的底部的主要内容,如果未能解决你的问题,请参考以下文章

将contentMode设置为UIViewContentModeScaleAspectFit时如何设置UIImageView左对齐或右对齐?

iOS:将 UIImageView 对齐到顶部

将 UIImageView 与自动布局对齐

UIGestureRecognizer 拖拽 UIView

Swift:将视图 X 点从中心对齐到后缘

在 Swift 中以编程方式将 UIImageView 左右对齐