Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 将旧式视图(音频单元视图)合并到自动布局中_Cocoa_Autolayout_Core Audio_Audiounit - Fatal编程技术网

Cocoa 将旧式视图(音频单元视图)合并到自动布局中

Cocoa 将旧式视图(音频单元视图)合并到自动布局中,cocoa,autolayout,core-audio,audiounit,Cocoa,Autolayout,Core Audio,Audiounit,我想将音频单元创建的自定义视图嵌入到使用自动布局的窗口中。在尝试了几十种组合之后,我仍然没有找到一种方法来处理大量的音频单元 目标是创建一个容器NSView对象,将音频单元视图作为子视图,并设置约束,使容器的大小与AU视图的大小匹配,包括AU视图调整自身大小时。容器应将translatesAutoResizengMaskintoConstraints设置为NO,以便与窗口的其余部分配合良好 我的第一次尝试是创建两个约束,简单地强制两个(容器和AU)视图的大小相等。这会失败,因为AU视图会塌陷到非

我想将音频单元创建的自定义视图嵌入到使用自动布局的窗口中。在尝试了几十种组合之后,我仍然没有找到一种方法来处理大量的音频单元

目标是创建一个容器
NSView
对象,将音频单元视图作为子视图,并设置约束,使容器的大小与AU视图的大小匹配,包括AU视图调整自身大小时。容器应将
translatesAutoResizengMaskintoConstraints
设置为
NO
,以便与窗口的其余部分配合良好

我的第一次尝试是创建两个约束,简单地强制两个(容器和AU)视图的大小相等。这会失败,因为AU视图会塌陷到非常小的大小

另一种尝试是为容器视图创建固定大小的约束,这些约束经过初始化以匹配AU视图,侦听AU视图的
NSViewFrameDidChangeNotification
,并根据需要调整固定大小。这会在AU视图想要调整自身大小时崩溃。原因是,当我增加容器的大小以匹配AU视图时,自动调整大小掩码约束会指示AU视图再次增加其大小,从而导致无限循环


到目前为止,最有效的方法是为AU视图关闭
translatesAutoresizingMaskIntoConstraints
,并通过监听帧更改通知来设置容器的大小。这似乎适用于所有AUv2音频单元,但对于AUv3音频单元(特别是苹果的演示AUv3),我总是得到一个(1,1)的视图大小,这显然是无用的。如果您能深入了解如何使这项工作顺利进行,我将不胜感激。

基于您提供的示例项目,这项工作应该会成功:

@接口MyViewController()
{
NSLayoutConstraint*宽度约束,*高度约束;
}
@结束
@MyViewController的实现
-(无效)setFormatForBus:(AUAUAUDIONUNITBUS*)总线
{
AudioStreamBasicDescription fmt={44100,kAudioFormatLinearPCM,KaudioFormatFlagis无交叉| KaudioFormatFlagis浮点| KaudioFormatFlag已打包,4,1,4,2,32,0};//每条总线上的立体声音频
AVAudioFormat*格式=[[AVAudioFormat alloc]initWithStreamDescription:&fmt];
n错误*错误=nil;
if(![bus setFormat:格式错误:&错误]){
NSLog(@“无法设置总线的格式…%@”,错误);
返回;
}
bus.enabled=是;
}
-(void)doLoad:(AVAudioUnit*)节点控制器:(NSViewController*)视图控制器
{
NSView*auView=nil;
if(viewController==nil){
auView=[[AUGenericView alloc]initWithAudioUnit:node.audioUnit显示标志:(AUVIEWProperties显示标志| AUViewParametersDisplayFlag)];
auView.frame=self.view.frame;
[self.view addSubview:auView];
}
否则{
self.auViewController=viewController;
auView=self.auViewController.view;
auView.translatesAutoresizingMaskIntoConstraints=否;
[self.view addSubview:auView];
}
NSSize size=\u auViewController.view.frame.size;
widthConstraint=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil属性:NSLayoutAttributeNotAttribute乘数:1常量:size.width];
heightConstraint=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil属性:NSLayoutAttributeNotAttribute乘数:1常量:大小.高度];
[self.view addConstraints:@[widthConstraint,heightConstraint];
NSLayoutConstraint*top=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual-toItem:auView
属性:NSLAYUTATTRIBUTETOP乘数:1.0常量:0];
NSLayoutConstraint*bottom=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual-toItem:auView
属性:NSLAYUTATTRIBUTEBOTTOM乘数:1.0常量:0];
NSLayoutConstraint*left=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:auView
属性:NSLAYUTATTRIBUTELEFT乘数:1.0常量:0];
NSLayoutConstraint*right=[NSLayoutConstraint constraintWithItem:self.view属性:NSLayoutAttributeRight关联人:NSLayoutRelationEqual to Item:auView
属性:NSLayoutAttributeRight乘数:1.0常量:0];
[self.view addConstraints:@[top,bottom,left,right]];
}
-(无效)viewDidLoad{
[超级视图下载];
NSArray*列表=[[AVAudioUnitComponentManager共享数据单元组件管理器]组件分配测试:^BOOL(AVAudioUnitComponent*组件,BOOL*停止){
返回[comp.typeName containssString:@“Effect”];
}];
AVAudioUnitComponent*组件=零;
用于(AVAudioUnitComponent*列表中的组件){
如果([comp.name containssString:@“MultibandCompressor”])//则允许对其进行压缩。此外,在切换“详细信息”时,它不会调整自身大小
//如果([comp.name containssString:@“FilterDemo”])//该音频单元在垂直和水平方向上都被压扁了…(需要先安装苹果的示例AUv3音频单元)
//如果([comp.name containssString:@“GraphicEQ”])//垂直挤压该组件
//if([comp.name containssString:@“AUDelay”])
组件=组件;
}
[AVAudioUnit实例化WithComponentDescription:组件。audioComponentDescription选项:0
completionHandler:^(\uuuuKindofAvaudioUnit*音频单元,N错误*错误){
如果