首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当父不是窗口时,有没有办法获得相对于最内层NSView的坐标?

当父不是窗口时,可以通过以下方式获得相对于最内层 NSView 的坐标:

  1. 获取当前视图的父视图:
代码语言:swift
复制
let superview = view.superview
  1. 获取父视图的子视图中当前视图的索引:
代码语言:swift
复制
let index = superview.subviews.firstIndex(of: view)
  1. 获取父视图的子视图中当前视图的坐标:
代码语言:swift
复制
let frame = view.frame
let origin = frame.origin
  1. 如果父视图的子视图中还有其他视图,则需要递归计算父视图的坐标:
代码语言:swift
复制
func getSuperviewOrigin(_ view: NSView) -> CGPoint {
    let superview = view.superview
    let index = superview.subviews.firstIndex(of: view)
    let frame = view.frame
    let origin = frame.origin
    if let superview = superview.superview {
        let superOrigin = getSuperviewOrigin(superview)
        return CGPoint(x: origin.x + superOrigin.x, y: origin.y + superOrigin.y)
    } else {
        return origin
    }
}

这样就可以获得当前视图相对于最内层 NSView 的坐标。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS界面布局的核心以及TangramKit介绍

TangramKit是iOS系统下用Swift编写的第三方界面布局框架。他集成了iOS的AutoLayout和SizeClass以及Android的五大容器布局体系以及HTML/CSS中的float和flex-box的布局功能和思想,目的是为iOS开发人员提供一套功能强大、多屏幕灵活适配、简单易用的UI布局解决方案。Tangram的中文即七巧板的意思,取名的寓意表明这个布局库可以非常灵巧和简单的解决各种复杂界面布局问题。他的同胞框架:MyLayout是一套用objective-C实现的界面布局框架。二者的主体思想相同,实现原理则是通过扩展UIView的属性,以及重载layoutSubviews方法来完成界面布局,只不过在一些语法和属性设置上略有一些差异。可以这么说TangramKit是MyLayout布局库的一个升级版本。大家可以通过访问下面的github站点去下载最新的版本:

03

史上最详细的iOS之事件的传递和响应机制-实践篇

之前我已经通过《史上最详细的iOS之事件的传递和响应机制-原理篇》比较详细的介绍过了事件的响应和传递的一些原理。如果说上篇是原理性文章,那么本篇文章更偏重于实践。本篇文章主要介绍如何利用事件处理的这些机制来处理公司开发中一些比较棘手的需求。例如,点击的是A视图,却要让B视图处理事件;点击子视图,却要让父视图处理事件等等。今天,我整理了下之前的杂记,罗列出了一些开发中可能遇到的情景和应对措施!当然,这要求我们对事件的传递和响应机制非常了解。如果对此不太了解,请阅读笔者的《史上最详细的iOS之事件的传递和响应机制-原理篇》。

02
领券