视图是控件的基础,本章介绍坐标系统,视图层级管理,绘制方法,事件响应基本概念;滚动条如何管理大范围视图。
NSView
- 我们做iOS的都知道UIView,差不多,但是macos的视图坐标系,左下角是(0,0)
- 如果想转换为和iOS的一样,覆盖视图的isFlipped方法
-(bool)isFlipped {return true;}
- frame & bounds这个老生常谈的问题在iOS移动开发中都知道,这里不做介绍
- 坐标转化和iOS的基本一样,convertPoint等方法实现
- viewWithTag和iOS的一样
- autosize布局就不说了,现在都是用autoLayout了
- layer和iOS有点不一样,就是需要设置self.wantsLayer = true 才有layer
- 视图绘制和截图以及事件响应我们通过实例来讲解
- 滚动视图控制大视图的滚动,原理就是通过NSClipView视图的bounds坐标的变化来实现滚动
- 滚动视图的实例教程请看视频
滚动视图
当视图size大于父视图size时,使用NSScrollView来控制显示
大家玩手机的时候,阅读文章上下滚动,其本质就是NSScrollView来做的
NSScrollView的内容视图是NSClipView,旁边的进度条是NSScroller
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-amExZO6O-1583682227794)(media/15824585974819/15836666903506.jpg)]
NSScrollView就是通过NSClipView视图bounds的x或y坐标变化来实现水平或上下滚动的
如何代码创建滚动视图
func addScrollView(){
let frame = CGRect(x: 0, y: 0, width: 500, height:300)
let myScrollView = NSScrollView(frame: frame)
let image = NSImage(named: NSImage.Name("desk"))
let imageViewFrame = CGRect(x: 0, y: 0, width: (image?.size.width)!, height: (image?.size.height)!)
let imageView = NSImageView(frame: imageViewFrame)
imageView.image = image
myScrollView.hasVerticalScroller = true
myScrollView.hasHorizontalScroller = true
myScrollView.documentView = imageView
self.view.addSubview(myScrollView)
}
如何滚动到指定位置
NSClipView提供俩方法感动到指定位置
func scroll(to newOrigin: NSPoint)
func scrollToVisible(_ rect: NSRect) -> Bool
如何禁止一个方向的滚动
子类和ScrollView,然后重写scrollWheel,在x或y到达某个值的时候返回即可
文章原文
本博客视频实例讲解教程可以去youtube、头条号、bilibili、csdn都可以找到.
bilibili和youtube都可以搜索到
视频地址之一
随课程的源码地址