zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    python的基本数据类型
    python数据基本运算处理===循环
    多态、多态性和鸭子类型
    菱形问题、类的组合
    类的继承
    面向对象基础
    软件开发三层架构
    logging模块
    json与pickle模块
    Webbrowser模拟百度一下子点击事件
  • 原文地址:https://www.cnblogs.com/sundaymac/p/10341431.html
Copyright © 2011-2022 走看看