iOS:以编程方式自动调整 UIImage 的大小

标签 ios iphone xcode uiimageview autosize

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

enter image description here

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

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

文件.m

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

最佳答案

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

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

因此,这会产生:

self.imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

顺便说一句,你可以通过经验来验证这一点。使用您与我们共享的 springs 和 struts 的组合临时在 Interface Builder 中添加一个 View :

mask

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

- (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.

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

(lldb) po [[UIWindow keyWindow] recursiveDescription]

That will generate output like so:

<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)。此输出也可用于诊断帧大小。


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

self.imageView.clipsToBounds = YES;

关于iOS:以编程方式自动调整 UIImage 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25519226/

相关文章:

html - 当我使用 wkwebview 加载本地 html 时,我发现它呈现速度比 uiwebview 慢

iphone - PhoneGap可以访问iPhone的语音识别软件吗?

ios 像 mspy 一样读取短信和通话记录

php - 错误域=NSCocoaErrorDomain 代码=3840 JSONObject

android - iOS 10 和 Xcode 8 上的 Cordova 6.3.1

iphone - 如何让底部的那些小 View 出现在 iOS SDK 中?

ios - 目标 View Controller 上的简单委托(delegate)方法或属性

ios - 在 ios objective c 中通过相机检测物体的速度

ios - iphone 在一个 UIViewController 和另一个 UIViewController 之间切换

objective-c - 初始化由 nswindowcontroller 隐式调用的 nsviewcontroller