【问题标题】:iOS: Autosizing an UIImage programmaticallyiOS:以编程方式自动调整 UIImage
【发布时间】:2014-10-20 13:41:00
【问题描述】:

我的应用程序中有一个 UIImage,我必须取消选中自动布局框并使用下图中显示的选项设置自动调整大小,以便图像在两种屏幕尺寸(3.5 英寸和 4 英寸)下都能正确显示

我的问题是,如何在代码中设置这些选项?

我试过了,但它似乎不起作用?我做错了吗?

文件.m

// Autosizing ImageOne
ImageOne.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleTopMargin;

【问题讨论】:

  • 您使用的是UIViewAutoresizingFlexibleTopMargin,但您应该使用UIViewAutoresizingFlexibleBottomMargin
  • 还是不行。因为这个问题,我使用了 UIViewAutoresizingFlexibleTopMargin:stackoverflow.com/questions/7754851/…

标签: ios iphone xcode uiimageview autosize


【解决方案1】:

在左侧、右侧和底部出现工字梁意味着它们是固定的(即不灵活),因此您应该使用UIViewAutoresizingFlexibleLeftMarginUIViewAutoresizingFlexibleRightMargin、或UIViewAutoresizingFlexibleBottomMargin。没有顶部工字梁意味着您应该使用UIViewAutoresizingFlexibleTopMargin

宽度箭头的存在意味着宽度是灵活的,因此您应该包括UIViewAutoresizingFlexibleWidth。但是没有高度箭头意味着不应该使用UIViewAutoresizingFlexibleHeight

因此,产生:

self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

顺便说一句,您可以凭经验验证这一点。使用您与我们共享的弹簧和支柱的组合在 Interface Builder 中临时添加一个视图:

然后您可以使用如下例程来检查该视图的自动调整大小掩码:

- (void)examineAutosizingMask:(UIView *)view
{
    NSDictionary *masks = @{@"UIViewAutoresizingFlexibleBottomMargin" : @(UIViewAutoresizingFlexibleBottomMargin),
                            @"UIViewAutoresizingFlexibleHeight"       : @(UIViewAutoresizingFlexibleHeight),
                            @"UIViewAutoresizingFlexibleLeftMargin"   : @(UIViewAutoresizingFlexibleLeftMargin),
                            @"UIViewAutoresizingFlexibleRightMargin"  : @(UIViewAutoresizingFlexibleRightMargin),
                            @"UIViewAutoresizingFlexibleTopMargin"    : @(UIViewAutoresizingFlexibleTopMargin),
                            @"UIViewAutoresizingFlexibleWidth"        : @(UIViewAutoresizingFlexibleWidth) };

    for (NSString *key in masks) {
        if (view.autoresizingMask & [masks[key] longValue]) {
            NSLog(@"%@", key);
        }
    }
}

上面的例程会确认你想要UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth

您也可以在调试器中确认这一点,因为它提供了一个很好的工具来检查视图的配置(它们的框架和自动调整大小的掩码)。在调试器中运行应用程序,一旦出现视图,点击暂停按钮。然后,在(lldb) 提示符下,键入:

(lldb) po [[UIWindow keyWindow] recursiveDescription]

这将产生如下输出:

<UIWindow: 0x8c61080; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x8c60070>; layer = <UIWindowLayer: 0x8c609b0>>
   | <UIView: 0x8c614d0; frame = (0 0; 320 480); autoresize = RM+BM; layer = <CALayer: 0x8c615b0>>
   |    | <UIImageView: 0x8d212a0; frame = (80 159; 160 263); autoresize = W+TM; userInteractionEnabled = NO; layer = <CALayer: 0x8d213a0>>

如您所见,这也报告了宽度和上边距自动调整大小蒙版已被使用(其中显示为W+TM)。此输出还可用于诊断帧大小。


顺便说一句,除了如上所述设置自动调整大小位掩码外,您可能还需要确认内容模式和剪辑设置。值得注意的是,您可能还需要确保将图像视图剪辑到其边界(否则图像可能会溢出边界,从而误导您对框架的实际大小):

self.imageView.clipsToBounds = YES;

【讨论】:

    【解决方案2】:

    如果您想全屏拍摄图像,请进行如下设置:

    希望这会有所帮助.. :)

    【讨论】:

    • 感谢您回复 Rashad。我知道该怎么做,我的问题是如何以编程方式做到这一点?
    【解决方案3】:

    UIImageView contentMode 属性设置为 UIViewContentModeScaleAspectFit

    ImageOne.contentMode = UIViewContentModeScaleAspectFill;
    ImageOne.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin |UIViewAutoresizingFlexibleTopMargin;
    

    【讨论】:

    • 代码是正确的,但我的项目中的某些内容无法正常工作。谢谢你的回复,我会努力找出问题的。
    猜你喜欢
    • 2015-04-23
    • 2012-08-13
    • 2012-04-06
    • 2021-01-24
    • 1970-01-01
    • 2012-11-09
    • 2016-12-13
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多