>左视图是一个占位符视图(在Interface Builder中添加).当应用程序加载时,我添加由NSVIEwController管理的子视图. NSVIEwController绘制不同的彩色矩形,每个都是NSVIEw,并且由约束创建的这些彩色视图的布局以编程方式创建并添加到控制器的-loadVIEw方法.
>正确的视图是一个NStableVIEw(在Interface Builder中添加).当应用程序加载时,我使用相同的NSVIEwController类来为表视图提供视图(仅添加一行).
当我添加子视图的占位符视图我还添加了两个附加约束,
[_placeholderVIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[CTRL_VIEW]|" options:0 metrics:nil vIEws:vIEws]];[_placeholderVIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[CTRL_VIEW]|" options:0 metrics:nil vIEws:vIEws]];
这些约束将子视图的框架设置为等于超级视图的边界.一切都很好.
但是,当我使用委托方法-tableVIEw提供NStableVIEw的视图:vIEwFortableColumn:row:时,视图尚未添加到表中.因此,它没有超级视图,所以约束不能(还)添加到视图中.这就是为什么表视图中的视图没有与表视图单元格相同的边界.
所以我的问题是如何添加约束到我提供给表视图的视图?表视图添加后,是否可以重新访问视图?这似乎有点黑客.
AppDelegate.h的源代码,
#import <Cocoa/Cocoa.h>@class BlahVIEwController;@interface AppDelegate : NSObject <NSApplicationDelegate,NStableVIEwDataSource,NStableVIEwDelegate>@property (assign) IBOutlet NSWindow *window;/* left vIEw controller and place holding vIEw */@property (strong) BlahVIEwController *vIEwController;@property (weak) IBOutlet NSVIEw *placeholderVIEw;/* Right vIEw (which is an NStableVIEw) */@property (weak) IBOutlet NStableVIEw *tableVIEw;@end
和AppDelegate.m,
#import "AppDelegate.h"#import "BlahVIEwController.h"@interface AppDelegate ()@property NSMutableArray *tableData;@end@implementation AppDelegate- (ID)init{ self = [super init]; if (self) { _tableData = [[NSMutableArray alloc] init]; [_tableData addobject:[[BlahVIEwController alloc] initWithNibname:@"BlahVIEwController" bundle:nil]]; [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints"]; } return self;}- (voID)applicationDIDFinishLaunching:(NSNotification *)aNotification { /* Add a managed subvIEw to the place holder vIEw*/ _placeholderVIEw.layer.backgroundcolor = CGcolorCreateGenericGray(0.5,1.0); _vIEwController = [[BlahVIEwController alloc] initWithNibname:@"BlahVIEwController" bundle:nil]; [_vIEwController.vIEw setFrame:_placeholderVIEw.bounds]; [_placeholderVIEw addSubvIEw:_vIEwController.vIEw]; /* Additional constraints so the managed subvIEw resizes with the place holder vIEw */ NSDictionary *vIEws = @{ @"CTRL_VIEW" : _vIEwController.vIEw }; [_placeholderVIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[CTRL_VIEW]|" options:0 metrics:nil vIEws:vIEws]]; [_placeholderVIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[CTRL_VIEW]|" options:0 metrics:nil vIEws:vIEws]];}-(NSInteger) numberOfRowsIntableVIEw:(NStableVIEw *)tableVIEw{ return [_tableData count];}-(ID) tableVIEw:(NStableVIEw *)tableVIEw vIEwFortableColumn:(NStableColumn *)tableColumn row:(NSInteger)row { return [_tableData[row] vIEw];}-(CGfloat) tableVIEw:(NStableVIEw *)tableVIEw heightOfRow:(NSInteger)row { return 150.;}@end
更新@jrturton
在 – (voID)tableVIEw中添加约束:(NStableVIEw *)tableVIEw dIDAddRowVIEw:(NStableRowVIEw *)rowVIEw forRow:(NSInteger)行工作.
@swalkner
我添加的约束是非常基本的,
-(voID) tableVIEw:(NStableVIEw *)tableVIEw dIDAddRowVIEw:(NStableRowVIEw *)rowVIEw forRow:(NSInteger)row {NSVIEw *vIEw = [rowVIEw vIEwAtColumn:0];NSDictionary *vIEws = NSDictionaryOfVariableBindings(vIEw);[vIEw.supervIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-12-[vIEw]-12-|" options:0 metrics:nil vIEws:vIEws]];[vIEw.supervIEw addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-12-[vIEw]-12-|" options:0 metrics:nil vIEws:vIEws]];}解决方法 您可以在代理方法中添加到表中后访问该视图tableVIEw:willdisplayCell:fortableColumn:row :.在这一点上,您可以添加约束,但您可能需要注意不要再一次添加相同的约束.
当你发现自己,方法tableVIEw:dIDAddRowVIEw:forRow:将是一个更好的地方,因为这将只会调用一次新的视图.
您也可以通过在视图上设置灵活的宽度自动调整蒙版,而不是任何水平尺寸约束来实现此目的.添加单元格视图时,该表可能会考虑到这一点.如果小心,您可以混合和匹配自动调整和约束.
我知道一些iOS,一些autolayout和只有一点OS X,所以我不能给你比这更多.我们不必担心在iOS地区的细胞宽度变化很大!
总结以上是内存溢出为你收集整理的可可 – 当视图由NSViewController提供时,如何使用基于视图的NSTableView的autolayout?全部内容,希望文章能够帮你解决可可 – 当视图由NSViewController提供时,如何使用基于视图的NSTableView的autolayout?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)