• oc之mac中- NSBox


    https://blog.csdn.net/lovechris00/article/details/77978675

    定义

    NSBox 继承自 NSView。一般作为有标题的容器使用,适用于分组和滚动视图。

    NSBox、NSScrollView、和NSSplitView、NSRulerView 比较

    类用于为窗口中的视图集合或其它视图对象提供图形“附件”。

    NSBox 类可以将窗口中的元素分组,并为整组元素描画一个边界。
    NSSplitView 类可以在垂直或水平方向附加一些视图,并为每个视图分配一定的公共区域,用户可以通过滑动控制条来重新分配视图的区域。
    NSScrollView 类,及其辅助类 NSClipView,为用户提供一个滚动机制,以及让用户初始化和控制滚动的图形对象。
    NSRulerView 类则可以为一个滚动视图添加标尺和标志。
    创建及使用

    代码如下

    - (void)addBox{

        NSBox *box=[[NSBox alloc] initWithFrame:NSMakeRect(15.0,10,300,300)];

        [box setBoxType:NSBoxPrimary]; //盒子样式
        [box setTitlePosition:NSAtTop]; //标题相对盒子的位置

        box.contentViewMargins = NSMakeSize(20, 30); //左右、上下

        box.contentView.wantsLayer = YES;
        box.contentView.layer.backgroundColor = [NSColor cyanColor].CGColor;

        NSTextField *textField = [[ NSTextField alloc]
                                  initWithFrame:NSMakeRect(10,10,80,20)];
        textField.backgroundColor = [NSColor redColor];
        [box.contentView addSubview:textField];

        [self.window.contentView addSubview:box];

    }

    属性

    背景色

    如下设置背景色无效

    box.wantsLayer = YES;
    box.layer.backgroundColor = [NSColor cyanColor].CGColor;

    设置 contentView 有效:

    box.contentView.wantsLayer = YES;
    box.contentView.layer.backgroundColor = [NSColor cyanColor].CGColor;

    问题:如何设置 margin 的背景色呢?希望知道的童鞋们回复我。

    标题

    只显示一行

    无论标题输入多少文字,无论标题显示在哪个位置,只显示一行文字。
    NSTitlePosition 标题位置

    typedef NS_ENUM(NSUInteger, NSTitlePosition) {

        NSNoTitle               = 0,
        NSAboveTop              = 1,
        NSAtTop             = 2,
        NSBelowTop              = 3,
        NSAboveBottom           = 4,
        NSAtBottom              = 5,
        NSBelowBottom           = 6
    };

    NSBoxType 盒子样式

    typedef NS_ENUM(NSUInteger, NSBoxType) {

        NSBoxPrimary    = 0,    // group subviews with a standard look. default
        NSBoxSecondary  = 1,    // same as primary since 10.3
        NSBoxSeparator  = 2,    // vertical or horizontal separtor line.  Not used with subviews.
        NSBoxOldStyle   = 3,    // 10.2 and earlier style boxes
        NSBoxCustom NS_ENUM_AVAILABLE_MAC(10_5) = 4     // draw based entirely on user parameters, not human interface guidelines
    };

     
    山里孩子往外走: 问题:如何设置 margin 的背景色呢?希望知道的童鞋们回复我。 //盒子样式为自定义时候才可以修改背景色
    [box setBoxType:NSBoxCustom]; 
    [box setFillColor:[NSColor redColor]]; 
    [box setBorderColor:[NSColor blueColor]];
    --------------------- 
    作者:lovechris00 
    原文:https://blog.csdn.net/lovechris00/article/details/77978675 

     缩放窗口时保持首列面板大小

    默认情况下,当用户缩放窗口大小时,Split View 会自动调整中轴的位置,保持原有左右两侧的宽度比例不变,但这样两侧面板的大小就都发生改变了,如果我们想锁定一侧的面板大小,可以使用下面这个小 trick:

    首先设置 NSSplitView的 delegate属性,为其赋一个代理对象,实现 splitView:resizeSubviewsWithOldSize:方法:

    - (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize {
        CGFloat oldWidth = splitView.arrangedSubviews.firstObject.frame.size.width;
        [splitView adjustSubviews];
        [splitView setPosition:oldWidth ofDividerAtIndex:0];
    }
    

    简单解释一下这段代码,文档中指出,如果代理实现了该方法,那么 Split View 在被改变大小时不会做出任何布局操作,而是需要开发者自己实现布局逻辑。这里使用 adjustSubviews方法可以借用一下未实现该代理方法时的布局逻辑,但如果单纯调用它,中轴位置还是会改变,因此我们可以在调用它之前先记录一下中轴的位置,其位置就是第一个面板的宽度。然后执行默认布局逻辑,最后我们再调整中轴位置为之前记录下的位置就 OK 了!

    2. 限制面板最大最小尺寸

    通常来讲,我们不希望两侧面板的大小可以无限调整,最左侧的面板一般会被限制在一定范围内。这里我们可以通过实现 splitView:constrainMinCoordinate:ofSubviewAt:代理方法来做出限制,如果 Split View 中只有两个 View,可以这么写:

    - (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMinimumPosition ofSubviewAt:(NSInteger)dividerIndex {
        return 200;
    }
    

    这样,左侧面板的宽度就不能小于 200 了,最大值同理。


    链接:https://www.jianshu.com/p/02df793cf99a


    如何让NSSplitView的子View的大小固定

     


    -(void)splitView:(NSSplitView *)sender resizeSubviewsWithOldSize: (NSSize)oldSize
    {
    CGFloat dividerThickness = [sender dividerThickness];
    NSRect leftRect = [[[sender subviews] objectAtIndex:0] frame];
    NSRect rightRect = [[[sender subviews] objectAtIndex:1] frame];
    NSRect newFrame = [sender frame];
    }

     

    本例子实现在NSSplitview控件上下拖动或左右拖动时 两个子窗口自动调整的按钮

    下载样例代码

    //  AppDelegate.h
    //  Cocoa_SplitView
     
    #import <Cocoa/Cocoa.h>
     
    @interface AppDelegate : NSObject <NSApplicationDelegate,NSSplitViewDelegate>
     
    @property (assign) IBOutlet NSTextView *textView;
    @property (assign) IBOutlet NSSplitView *splitView;
    @property (assign) IBOutlet NSTableView *tableView;
    @property (assign) IBOutlet NSButton *button;
     
    @property (assign) IBOutlet NSWindow *window;
     
    - (IBAction)dosome:(id)sender;
     
    @end


    //
    //  AppDelegate.m
    //  Cocoa_SplitView
    #import "AppDelegate.h"
     
    @implementation AppDelegate
    @synthesize textView = _textView;
    @synthesize splitView = _splitView;
    @synthesize tableView = _tableView;
    @synthesize button = _button;
     
    - (IBAction)dosome:(id)sender
    {
        NSSize size = {50,50};
        [[self.textView enclosingScrollView] setFrameSize:size];
    }
     
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
    }
     
    - (void) splitViewWillResizeSubviews:(NSNotification *)notification
    {
        NSLog(@"splitViewWillResizeSubviews");
    }
     
    - (void) splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize
    {
        NSLog(@"resizeSubviewsWithOldSize");
    }
     
    - (BOOL) splitView:(NSSplitView *)splitView shouldAdjustSizeOfSubview:(NSView *)view
    {
        NSLog(@"shouldAdjustSizeOfSubview");
        return YES;
    }
     
    - (void) splitViewDidResizeSubviews:(NSNotification *)notification
    {
        NSLog(@"splitViewDidResizeSubviews");
        NSRect rect = [self.splitView frame];
        NSLog(@"nssplitview %f,%f,%f,%f",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
        
        NSArray *subviews = [self.splitView subviews];
        
        NSView *topView = [subviews objectAtIndex:0];
        NSRect trect = [topView frame];
        NSLog(@"top view %f,%f,%f,%f",trect.origin.x,trect.origin.y,trect.size.width,trect.size.height);
        
        [[self.textView enclosingScrollView] setFrame:trect];
        
        NSView *bottomView = [subviews objectAtIndex:1];
        NSRect brect = [bottomView frame];
        NSPoint point = {0,0};
        NSRect lbrect = {point,brect.size};
        [[self.tableView enclosingScrollView] setFrame:lbrect];
        
        NSLog(@"bottom view %f,%f,%f,%f",brect.origin.x,brect.origin.y,brect.size.width,brect.size.height);
        
    }
     
    @end


    注意:

    1.在nssplitview控件的属性中一定不能钩选择“USE Autolayout”否则在委托处理中的逻辑将失效

    2.nssplitview的委托一定要设置为appdelegate

    效果图

    有用资源:http://www.cocoabuilder.com/archive/cocoa/326128-nssplitview-not-resizing-subviews-if-delegate-is-used.html
    --------------------- 
    原文:https://blog.csdn.net/bjbs_270/article/details/12957607 

  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10341431.html
Copyright © 2020-2023  润新知