详情看 http://note.youdao.com/noteshare?id=ec901d56341207052b2d19233b5ddba3

这里仅仅贴出文字,完整内容请看上面链接。

有这样一个需求:让LabelA停靠在LabelB的某个位置,同时要适应labelA的变化的长度。
 
1. LabelA和LabelB的OverFlow方式是ResizeFreely,使Label的尺寸能够变化。
2. 根据公式得到labelB的位置:
labelB.anchoredposition
= labelA.anchoredposition - labelA.pivot*labelA.size (此时指向labelA的左下角位置)
+ harborAnchor*labelA.size (harborAnchor是归一化的位置值,(1,1)labelA的右上角)
+ AbsoluteOffset(绝对偏移)
3. 需要设置labelB的pivot,例如如果想要让labelB如上图所示停靠在labelA的底线上且是右侧且有一个绝对偏移值(10,0),则将labelB的widget的pivot设置为左下。将harborAnchor设置为(1,0)。
 
▼代码开始
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
 
public class UILabelDock: MonoBehaviour
{
    public const string Specification = "将某UI停靠在某个Label(称为HarborLabel)的HarborAnchor处,这两个UI需要在同一个GameObject下";
 
    public UILabel m_HarborLabel = null;
 
    [Tooltip("设置港口Widget的锚点,港口Widget内容区域的左下角是(0,0),右上角是(1,1)")]
    public Vector2 m_HarborAnchor = new Vector2(1, 0.5f);
 
    RectTransform m_MyRectTransform = null;
    RectTransform m_HarborTransform = null;
    UIWidget m_HarborWidget = null;
 
    [Tooltip("绝对偏移值")]
    public Vector2 m_AbsoluteOffset = new Vector2(0, 0);
 
    private void Awake()
    {
        m_MyRectTransform = GetComponent<RectTransform>();
        m_HarborTransform = m_HarborLabel.GetComponent<RectTransform>();
        m_HarborWidget = m_HarborLabel.GetComponent<UIWidget>();
    }
   
    public void RefreshDock()
    {
        Awake();
        if (m_HarborLabel == null || m_MyRectTransform == null || m_HarborWidget == null || m_HarborTransform)
        {
            Debug.LogError("LabelDock Error");
            return;
        }
 
        //需要确保
        m_MyRectTransform.anchorMax = m_HarborTransform.anchorMax;
        m_MyRectTransform.anchorMin = m_HarborTransform.anchorMin;
        m_MyRectTransform.offsetMax = m_HarborTransform.offsetMax;
        m_MyRectTransform.offsetMin = m_HarborTransform.offsetMin;
        m_MyRectTransform.pivot = m_HarborTransform.pivot;
        m_MyRectTransform.sizeDelta = m_HarborTransform.sizeDelta;
 
        var normalizedOffset = new Vector2(0, 0);
        switch (m_HarborWidget.pivot)
        {
            case UIWidget.Pivot.Bottom:
                {
                    normalizedOffset = new Vector2(0.5f, 0);
                    break;
                }
            case UIWidget.Pivot.BottomLeft:
                {
                    normalizedOffset = new Vector2(0, 0);
                    break;
                }
            case UIWidget.Pivot.BottomRight:
                {
                    normalizedOffset = new Vector2(1, 0);
                    break;
                }
            case UIWidget.Pivot.Center:
                {
                    normalizedOffset = new Vector2(.5f, .5f);
                    break;
                }
            case UIWidget.Pivot.Left:
                {
                    normalizedOffset = new Vector2(0, .5f);
                    break;
                }
            case UIWidget.Pivot.Right:
                {
                    normalizedOffset = new Vector2(1, .5f);
                    break;
                }
            case UIWidget.Pivot.Top:
                {
                    normalizedOffset = new Vector2(.5f, 1);
                    break;
                }
            case UIWidget.Pivot.TopLeft:
                {
                    normalizedOffset = new Vector2(0, 1);
                    break;
                }
            case UIWidget.Pivot.TopRight:
                {
                    normalizedOffset = new Vector2(1, 1);
                    break;
                }
        }
 
        normalizedOffset = m_HarborAnchor - normalizedOffset;
        m_MyRectTransform.anchoredPosition = m_HarborTransform.anchoredPosition + new Vector2(normalizedOffset.x * m_HarborLabel.printedSize.x, normalizedOffset.y * m_HarborLabel.printedSize.y) + m_AbsoluteOffset;
    }
}
 
 
▲代码结束
 

NGUI中LabelA停靠LabelB的方法的更多相关文章

  1. NGUI中Button与原生2D精灵的混合使用

    一些废话 每一篇的首段都是这个“一些废话”,原因是我太能逼逼了,不逼逼一些废话我就觉得难受.这是我第四篇关于Unity的博文,前两篇还是去年写的,“从一点儿不会开始”系列,类似教程和学习笔记的博文,这 ...

  2. Unity3D在NGUI中使用mask

    过程是这样的:最近一直想做一个头像的mask效果,后来发现原来unity的mask需要用shader来写,网上找了不少资料,也能实现,不过大多数都是用render texture作为相机投影的text ...

  3. (转)NGUI中深度depth和z轴关系

    先列出转载链接: http://game.ceeger.com/forum/read.php?tid=8917 转载原文: 问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖 ...

  4. NGUI制作字体的三种方法

    主要参考两篇博文: (1).NGUI制作字体的三种方法 (2).使用位图字体工具BMFont从图片生成自定义字体 1.BMFont下载地址 http://www.angelcode.com/produ ...

  5. (转)ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

    早上同事用PL/SQL连接虚拟机中的Oracle数据库,发现又报了"ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务"错误,帮其解决后,发现很多人遇到过这样的问 ...

  6. 解析Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下   DOM方法:父窗口操作IFRAME:window.frames[&q ...

  7. 在html中添加script脚本的方法和注意事项

    在html中添加script脚本有两种方法,直接将javascript代码添加到html中与添加外部js文件,这两种方法都比较常用,大家可以根据自己需要自由选择 在html中添加<script& ...

  8. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  9. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

随机推荐

  1. Js 日期选择,可以的一个页面中重复使用本JS日历,兼容IE及火狐等主流浏览器,而且界面简洁、美观,操作体验也不错。

    <html> <head> <title>Js日期选择器并自动加入到输入框中</title> <meta http-equiv="con ...

  2. Vim技能修炼教程(10) - 代码跳转

    程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...

  3. HAWQ + MADlib 玩转数据挖掘之(三)——向量

    一.定义 这里不讨论向量严格的数学定义.在Madlib中,可以把向量简单理解为矩阵.矩阵是Madlib中数据的基本格式,当矩阵只有一维时,就是向量,1行n列的矩阵称为行向量,m行1列的矩阵称为列向量, ...

  4. runtime 知识点

    demo https://github.com/ZOYOOPlus/runtime2 // //  ViewController.m //  runtime //  Copyright © 2017年 ...

  5. IOS开发 arc与非Arc代码的区别

    是属于ios开发中的内存管理问题:在这我简要概述一下,详细讲的话内容挺多,而且是作为一个ios开发人员,或ios开发爱好者,这是必须了解的:Objective-c中提供了两种内存管理机制MRC(Man ...

  6. MarkDown初学

    什么是MarkDown? 第一次用这个MarkDown,感觉很好,界面友好,使用简洁而又使用,最主要的是此园支持这个语法,欣慰欣慰!先这么多,看看效果如何 推荐个不错的学习网站 Markdown 语法 ...

  7. 【sklearn】网格搜索 from sklearn.model_selection import GridSearchCV

    GridSearchCV用于系统地遍历模型的多种参数组合,通过交叉验证确定最佳参数. 1.GridSearchCV参数    # 不常用的参数 pre_dispatch 没看懂 refit 默认为Tr ...

  8. Jmeter简单的操作数据库

    mysql驱动包下载地址: https://dev.mysql.com/downloads/connector/j/ 1.添加驱动配置,把下载下来的驱动配置上去 2.添加‘配置元件-用户定义的变量’, ...

  9. mongodb查询(转载)

    1.  基本查询:    构造查询数据.    > db.test.findOne()    {         "_id" : ObjectId("4fd58ec ...

  10. 每天一个linux命令:【转载】less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...