无法在代码中更改 .xib UI 对象的框架

Posted

技术标签:

【中文标题】无法在代码中更改 .xib UI 对象的框架【英文标题】:Can't change the frames of .xib UI objects in code 【发布时间】:2013-09-05 17:26:06 【问题描述】:

我正在尝试重新编写我的代码,以允许我使用 xibs 来设计自定义 UIView,以便在我的整个项目中重复使用。我创建了一个名为 SlidesView 的类,它有一个同名的 .xib。我已经使用以下 IBOutlets 进行了设置:

@property (nonatomic, retain) IBOutlet UIImageView *ivMain;
@property (nonatomic, retain) IBOutlet UILabel *lHeader;
@property (nonatomic, retain) IBOutlet UITextView *tvMain;
@property (nonatomic, retain) IBOutlet UIImageView *ivIcon;

我已确保这些都在 .xib 文件中正确连接。我还有一个函数,我想用它来设置视图的所有初始数据:

- (void)setupUsingCenter:(CGPoint)center mainImage:(UIImage *)mainImage mainText:(NSString *)mainText header:(NSString *)header andIconImage:(UIImage *)iconImage

“setupUsingCenter:self ...”主体如下所示:

// First check for a main image and image icon    
    if (mainImage != nil)
    
        // Set the image
        [self.ivMain setImage:mainImage];
        [self.ivMain setFrame:CGRectMake(10, 10, 10, 10)];

        // If image icon set that too
        if (iconImage != nil)
        
            [self.ivIcon setImage:iconImage];
        
    

最后我使用以下代码加载这个 .xib:

NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"SlidesView" owner:nil options:nil];

        for (UIView *view in views) 
            if([view isKindOfClass:[SlidesView class]])
            
                SlidesView *slidesView = (SlidesView *)view;
                [slidesView setupUsingCenter:self.vPlaceholder.center mainImage:slideImage mainText:slideText header:slideTitle andIconImage:slideIcon];
                [slidesView setTextColours:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1.0f]];
                [self.view addSubview:slidesView];
                self.viewPopup = slidesView;
            
        

出于测试目的,我已经输入了随机 setFrame 参数,但由于某种原因,框架没有改变。但是,ivMain 上的图像确实发生了变化。谁能解释我如何更改 UI 对象的框架?另外,为什么它允许我更改图像但框架似乎不可编辑,这是否意味着它必须初始化?

非常感谢任何帮助, 谢谢。

【问题讨论】:

【参考方案1】:

您确定在 .xib 上禁用了 autolayout 吗?据我了解,当autolayout 开启时,您无法编辑帧。

如果是这种情况,您可以为特定的.xib 禁用autolayout,或者您可以使用constraints 而不是frame 属性

【讨论】:

非常感谢您的帮助,这让我发疯了,为什么这不起作用! 我的 XIB 中有一个 UIButton,即使禁用了自动布局,我也无法更改其图像【参考方案2】:

使用自动调整大小可能会导致一些意想不到的行为,自动调整子视图也是如此。

你可以试试这样的:

[View setAutoresizingMask:UIViewAutoresizingNone];

还有:

[View setAutoresizesSubviews:NO];

View 是您要应用该行为的 UIView。

【讨论】:

以上是关于无法在代码中更改 .xib UI 对象的框架的主要内容,如果未能解决你的问题,请参考以下文章

XCode 不允许我更改代码

Xcode 代码链接错误始终显示“对象:退出”并且无法更改连接类型

无法更改 IBOutlet 属性的框架

无法更改 UITableViewController 颜色背景

关于代码手写UI,xib和StoryBoard

UI到底应该用xib/storyboard完成,还是用手写代码来完成?