ios – 以编程方式从XIB调整自定义UIView

ios – 以编程方式从XIB调整自定义UIView,第1张

概述我有以下问题:我已经在XIB文件中创建了一个自定义的UIView类及其布局.让我们说XIB中的自定义视图的大小是150 x 50.我已经启用了sizeClasses(wAny hAny)和AutoLayout.在模拟指标中,我设置了Size = Freeform,Status Bar = None,all other = Inferred. 我的自定义UIView类的代码如下所示: #import 我有以下问题:我已经在XIB文件中创建了一个自定义的UIVIEw类及其布局.让我们说XIB中的自定义视图的大小是150 x 50.我已经启用了sizeClasses(wAny hAny)和autoLayout.在模拟指标中,我设置了Size = Freeform,Status bar = None,all other = Inferred.

我的自定义UIVIEw类的代码如下所示:

#import "CustomVIEw.h"@implementation CustomVIEw#pragma mark - Object lifecycle- (ID)initWithFrame:(CGRect)frame {    self = [super initWithFrame:frame];    if (self) {        [self setup];    }    return self;}- (ID)initWithCoder:(NSCoder *)aDecoder {    self = [super initWithCoder:aDecoder];    if (self) {        [self setup];    }    return self;}#pragma mark - Private & helper methods- (voID)setup {    if (self.subvIEws.count == 0) {        [[NSBundle mainBundle] loadNibnamed:@"CustomVIEw" owner:self options:nil];        self.bounds = self.vIEw.bounds;        [self addSubvIEw:self.vIEw];    }}@end

在我想要添加这个自定义UIVIEw的UIVIEwController中,我已经创建了虚拟UIVIEw(我在Interface Builder中设置了大小),我想添加我的CustomVIEw,我希望我的CustomVIEw适合我的容器视图的边界.

我正试图这样做:

_vCustomVIEw = [[CustomVIEw alloc] init];_vCustomVIEw.translatesautoresizingMaskIntoConstraints = NO;[_vContainer addSubvIEw:_vCustomVIEw];[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomVIEw attribute:NSLayoutAttributeleft relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeleft multiplIEr:1.0 constant:0.0]];[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomVIEw attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeRight multiplIEr:1.0 constant:0.0]];[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomVIEw attribute:NSLayoutAttributetop relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributetop multiplIEr:1.0 constant:0.0]];[_vContainer addConstraint:[NSLayoutConstraint constraintWithItem:_vCustomVIEw attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:_vContainer attribute:NSLayoutAttributeBottom multiplIEr:1.0 constant:0.0]];

但没有运气.假设我的容器视图是300 x 100,当我添加自定义UIVIEw时,我的自定义视图仍然是150 x 50.

我试图在没有容器视图的情况下工作 – 将我的自定义UIVIEw对象直接添加到我的UIVIEwController的self.vIEw中,并将其宽度和高度设置为:

> autoLayout约束
>在初始化我的自定义UIVIEw时使用initWithFrame

但再次 – 没有运气.自定义视图始终为150 x 50.

有人可以向我解释如何以编程方式添加我在XIB中制作的自定义UIVIEw,并使用autoLayout约束调整大小?

提前谢谢了.

编辑#1:尝试在我的CustomVIEw上运行Andrea的代码时遇到错误

Probably at least one of the constraints in the following List is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSautoresizingMaskLayoutConstraints that you don't understand,refer to the documentation for the UIVIEw property translatesautoresizingMaskIntoConstraints) (    "<NSLayoutConstraint:0x17489b760 V:[UIVIEw:0x17418d820(91)]>","<NSLayoutConstraint:0x170c9bf80 V:|-(0)-[CustomVIEw:0x1741da7c0]   (names: '|':CustomVIEw:0x1741da8b0 )>","<NSLayoutConstraint:0x170c9bfd0 V:[CustomVIEw:0x1741da7c0]-(0)-|   (names: '|':CustomVIEw:0x1741da8b0 )>","<NSLayoutConstraint:0x170c9be90 V:|-(0)-[CustomVIEw:0x1741da8b0]   (names: '|':UIVIEw:0x17418d820 )>","<NSLayoutConstraint:0x170c9bee0 CustomVIEw:0x1741da8b0.bottom == UIVIEw:0x17418d820.bottom>","<NSautoresizingMaskLayoutConstraint:0x170c9dba0 h=--& v=--& CustomVIEw:0x1741da7c0.mIDY == + 25.0>")Will attempt to recover by breaking constraint <NSLayoutConstraint:0x170c9bfd0 V:[CustomVIEw:0x1741da7c0]-(0)-|   (names: '|':CustomVIEw:0x1741da8b0 )>

编辑#2:它的作品!

之后@Andrea补充说:

vIEw.translatesautoresizingMaskIntoConstraints = NO;

在他的:

- (voID) stretchToSuperVIEw:(UIVIEw*) vIEw;

方法,一切都像我所料.

感谢@Andrea.

解决方法 我想主要的问题是,当您将xib添加到内容视图时,不要使用自动布局.
在你添加子视图init方法后,请调用该方法,传递xib的视图:
- (voID) stretchToSuperVIEw:(UIVIEw*) vIEw {    vIEw.translatesautoresizingMaskIntoConstraints = NO;    NSDictionary *bindings = NSDictionaryOfVariableBindings(vIEw);    Nsstring *formatTemplate = @"%@:|[vIEw]|";    for (Nsstring * axis in @[@"H",@"V"]) {        Nsstring * format = [Nsstring stringWithFormat:formatTemplate,axis];        NSArray * constraints = [NSLayoutConstraint constraintsWithVisualFormat:format options:0 metrics:nil vIEws:bindings];        [vIEw.supervIEw addConstraints:constraints];    }}

[编辑]
您的设置代码应如下所示:

- (voID)setup {    if (self.subvIEws.count == 0) {        [[NSBundle mainBundle] loadNibnamed:@"CustomVIEw" owner:self options:nil];        self.bounds = self.vIEw.bounds;        [self addSubvIEw:self.vIEw];        [self stretchToSuperVIEw:self.vIEw];    }}

注意里面的拉伸视图我添加了vIEw.translatesautoresizingMaskIntoConstraints = NO;

[编辑2]
我会尝试根据要求详细说明我的答案.使用autolayout,当您添加视图而不设置约束时,autolayout会自动将自动调整掩码转换为约束,其默认属性为UIVIEwautoresizingNone,这意味着不自动调整.
您的XIB视图已被添加到其父级,没有约束,并且没有自动调整的可能性,因此保持其原始大小.由于您希望您的观点根据您的观点调整大小,您有两种选择:

>将xib视图的自动调整掩码更改为灵活的宽度和高度,但需要匹配父大小,否则将不会有完整的封面
>添加一些约束,使两个视图的约束相应地更改为父更改.而您在xib视图和其父视图之间实现了这一点,即尾部/前导和顶部/底部之间的间距为0.就像您在其边框上粘贴一些胶水.要做到这一点,您需要将自动转换调整大小面罩设置为约束到否,或者您可以在日志中发布一些冲突.

您以后要做的是将视图(承载xib视图)的约束添加到其超级视图中,但是xib及其父级之间没有约束,因此autolayout不知道如何调整xib视图的大小.视图层次结构中的每个视图都应该有自己的约束.希望这有助于更好地了解.

总结

以上是内存溢出为你收集整理的ios – 以编程方式从XIB调整自定义UIView全部内容,希望文章能够帮你解决ios – 以编程方式从XIB调整自定义UIView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1095141.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存