SEO技术

SEO技术

Products

当前位置:首页 > SEO技术 >

建设中的网站如何撰写节能报告以符合环保要求?

96SEO 2026-02-23 13:26 3


束优先级

Masonry:iOS12Masonry源码解析下面是使用make.width点语法后的全部内部调用过程

建设中的网站如何撰写节能报告以符合环保要求?

Masonry使用

在写Masonry之前我想先来聊聊约束的基础知识我们首先要了解一个View的约束需要确定的是两个因素一个是宽高信息另外一个是位置信息。

只有确定这两个因素才能真正的确定一个View的约束否则约束会爆警告。

不管你怎么加约束其实最后归根到底都是确实的这两个信息那么我们了解这个有什么好处呢我们可以通过约束转化来了解我们多添加了约束是否缺失了某个约束这种思想可以帮助我们快速查询问题所在。

Masonry

的时候如果控件是UILabelUIImageViewUIButton等这些组件及某些包含它们的系统组件只需要指定控件的位置约束根本不需要指定宽高约束即可完成布局任务这是为什么呢这是因为这些控件中有

intrinsicContentSize

这个属性intrinsicContentSize的作用其实很简单它会自己根据内容计算出控件的固有宽高在布局过程当你不指定宽高约束的时候它就会生效。

具体的内容我会在下面说到。

这里就不过多叙述了。

首先Masonry的添加布局主要有三个三个方法的作用分别是创建约束更新某个约束其他约束不变移除先前所有约束添加新到的约束。

这三个方法根据场景需要合理使用否则可能造成内存问题优化方式下面我们会来聊一下这里就不过多叙述了。

(NSArray

*)mas_makeConstraints:(void(NS_NOESCAPE

*make))block;-

*)mas_updateConstraints:(void(NS_NOESCAPE

*make))block;-

*)mas_remakeConstraints:(void(NS_NOESCAPE

*make))block;

如果我们想设置一个具体的数值该怎么办呢例如宽度我们想设置成10个单位我们就可以如下设置。

[subView

mas_makeConstraints:^(MASConstraintMaker

*make)

这个函数的参数必须是一个对象类型这就很尴尬了为啥书写太麻烦这时候我们可以使用

mas_equalTo

mas_makeConstraints:^(MASConstraintMaker

*make)

上面书写的好像也不是一个最优的方案虽然我们解决了后面的问题但是前面的代码字母数又多了这时候我们可以在我们的文件之前加上一个

#define

是否已经被定义。

如果该宏已经被定义那么代码块中的宏定义就会生效否则这些宏定义将会被忽略。

Masonry

mas_equalTogreaterThanOrEqualTo

会被定义为

mas_greaterThanOrEqualTolessThanOrEqualTo

会被定义为

mas_makeConstraints:^(MASConstraintMaker

*make)

如果我们想要设置subView的宽度等于父视图的宽度的50%这时候我们该怎么编写我们的约束呢我们可以用到

multipliedBy

dividedBy这两个方法一个是乘法一个是除法较为简单示例代码如下所示。

//乘法

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.width.equalTo(self).multipliedBy(0.5);

}];

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.width.equalTo(self).dividedBy(2);

}];

如果我们想要subView的宽度等于高度的2倍这时候该怎么办呢我们需要指定equalTo()里面具体的值(实际上是传一个

MASViewAttribute

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.width.equalTo(subView.mas_height).multipliedBy(2);

}];

我们就简单叙述一下约束优先级设置Masonry为我们提供了三个优先级的方法priorityLow()、priorityMedium()、priorityHigh()这三个方法内部对应着不同的默认优先级当然我们也可以使用priority()

设置具体的数值。

示例代码如下所示关于约束优先级具体使用也会在后面的模块中说到。

[subView

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.width.equalTo(subView4).priorityLow();make.width.equalTo([subView2,

subView3,100]).priorityHigh();make.width.equalTo(300).priority(888);

}];

函数我们肯定不能设置两条约束条件如果那样设置了后面的约束条件就会把前面的约束条件给覆盖掉对此我们如下设置即可。

(offset方法和multipliedBy方法顺序无影响)

[subView

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.width.equalTo(self).offset(10).multipliedBy(0.3);

}];

约束优先级以及intrinsicContentSize的相关问题是我们不得不提到的问题.

首先来说一下为什么要有约束优先级,我们给定一个场景,假设我们设置在一个superView(宽度为

200)中的一个View子视图的左右边距都为0,然后第二个约束是视图的宽度为100,这时候就会出现问题,因为如果左右边距都为0,那么视图宽度为200,这样和第二个约束条件就发生了冲突,系统是不允许这样的问题出现的.那么我们想不在删除约束的情况下,该如何解决这种问题呢?这时候我们就需要通过设置约束优先级来解决这一类问题,系统通过比较两个”相互冲突的约束”的优先级从而忽略低优先级的某个约束达到正确布局的目的约束优先级默认都是1000.所以我们给设定一个根据具体情况设置一个合适的值即可,代码如下所示.

[subView

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.left.right.equalTo(self);make.width.equalTo(100).priority(888);

}];

约束优先级主要是应对与单个视图中多个约束发生冲突的时候解决问题的方案.而

intrinsicContentSize

主要应对于多个视图约束发生冲突的解决方案,我们就对着具体的实例来进行分析.

在最前面我们说到

intrinsicContentSize的作用其实很简单它会自己根据内容计算出控件的固有宽高在布局过程当你不指定宽高约束的时候它就会生效。

这个属性是非常的好用,但是也会出现对应的问题.例如我们现在有两个Label,两个Lable的约束条件如下所示.

[label1

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.left.equalTo(superView);make.top.equalTo(superView);

}];[label2

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.left.equalTo(label1.mas_right);make.top.equalTo(superView);

}];

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.left.equalTo(label1.mas_right);make.right.equalTo(superView);make.top.equalTo(superView);

}];这时候就会出现问题,label1

约束条件,必然有一个需要拉伸才能完成约束布局任务,我们称这种问题叫做

Intrinsic冲突.

(void)setContentHuggingPriority:(UILayoutPriority)priority

forAxis:(UILayoutConstraintAxis)axis

(void)setContentCompressionResistancePriority:(UILayoutPriority)priority

forAxis:(UILayoutConstraintAxis)axis

Content

约束不想变大约束表示如果组件的此属性优先级比另一个组件此属性优先级高的话那么这个组件就保持不变另一个可以在需要拉伸的时候拉伸。

属性分横向和纵向2个方向。

Content

约束不想变小约束表示如果组件的此属性优先级比另一个组件此属性优先级高的话那么这个组件就保持不变另一个可以在需要压缩的时候压缩。

属性分横向和纵向2个方向。

意思很明显。

上面UIlabel这个例子中很显然如果某个UILabel使用Intrinsic

Content

拉伸,label1尽量不拉伸,我们就可以设置如下代码.具体代码如下所示.

[label1

setContentHuggingPriority:UILayoutPriorityRequired

forAxis:UILayoutConstraintAxisHorizontal];

[label2

setContentHuggingPriority:UILayoutPriorityDefaultLow

forAxis:UILayoutConstraintAxisHorizontal];

Masonry:iOS12

我们都知道其实Masonry是封装系统的NSLayoutConstraints,简化了代码但是在iOS12之前NSLayoutConstraints存在着致命的问题那就是性能问题其实这个在iOS12之后也会存在只是小了很多。

那么在iOS12之前到底是什么原因导致这些问题呢接下来我们逐一分析各种情况。

Cassowary在WWDC2018官方对其性能问题提出了说明如下图所示我们可以清楚的看到iOS12前的AutoLayout布局性能是成指数性增长的。

![[Pasted

但是不是所有的布局都有这样的问题呢答案当然是否定的如下图所示。

所以说AutoLayout只是在某些情况存在着问题。

![[Pasted

那么真正的原始是什么呢因为iOS12之前当有约束变化时都会重新创建一个计算引擎

NSISEngier

将约束关系重新加起来重新计算。

涉及到约束关系变多时新的计算引擎需要重新计算最终导致计算量指数级增加。

iOS12的AutoLayout更多的利用了Cassowary算法的界面更新策略使其真正完成了高效的界面线性策略计算。

使其尽量成线程增加减少性能问题最后允许我唠叨一句讲真的性能再强也是干不过Frame布局方式的但是胜在简单方便。

Masonry源码解析

UIViewNSView、NSArray、UIViewController

[_masParView

mas_makeConstraints:^(MASConstraintMaker

*make)

{make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(100,

100,

100));}];调用的方法是UIView的分类MASAdditions中的mas_makeConstraints:方法

/***

使用被调用的视图创建一个MASConstraintMaker。

一旦代码块执行完毕任何定义的约束*

(NSArray

*)mas_makeConstraints:(**void**(NS_NOESCAPE

*make))block;实现

*)mas_makeConstraints:(void(^)(MASConstraintMaker

*))block

{self.translatesAutoresizingMaskIntoConstraints

*constraintMaker

initWithView:self];block(constraintMaker);return

[constraintMaker

translatesAutoresizingMaskIntoConstraints

属性设置为

块时我们可以使用这些方法来描述当前视图与其它视图之间的相对位置、尺寸等信息。

最后该方法调用

方法将约束应用到当前视图上并返回一个包含所有约束的数组。

install

方法会根据之前设置的约束信息计算出合适的约束并将其添加到相应的视图上。

在这个方法返回之后当前视图就会按照之前设置的约束进行自动布局。

*)view

对象。

这个对象包含了各种用于描述视图约束的方法我们可以在之后的代码中使用这些方法来描述视图之间的约束关系。

mas_makeConstraints

mas_makeConstraints:^(MASConstraintMaker

*make)

make.left.top.equalTo(superview).offset(10);

make.right.bottom.equalTo(superview).offset(-10);

make.left.top.equalTo(superview).offset(10)

make.right.bottom.equalTo(superview).offset(-10)

view1

对象的各种方法来描述视图之间的约束关系例如设置视图的位置、大小、间距等。

block

中描述的约束关系来自动计算视图的位置和大小并将这些约束关系应用到相应的视图上从而实现自动布局。

MASConstraintMaker

addConstraintWithLayoutAttribute:NSLayoutAttributeWidth];

(MASConstraint

*)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute

{return

addConstraintWithLayoutAttribute:layoutAttribute];

(MASConstraint

addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute

{//

layoutAttribute:layoutAttribute];//创建约束以约束单元作为约束的第一项MASViewConstraint

*newConstraint

initWithFirstViewAttribute:viewAttribute];if

([constraint

isKindOfClass:MASViewConstraint.class])

{//replace

newConstraint];MASCompositeConstraint

*compositeConstraint

initWithChildren:children];compositeConstraint.delegate

self;//

shouldBeReplacedWithConstraint:compositeConstraint];//

返回组合约束return

如果不是在已有约束的基础上再创建约束则添加约束至列表newConstraint.delegate

self;//

addObject:newConstraint];}return

newConstraint;

}在第二次设置约束时.height会进入不同的流程。

注意上面提到的newConstraint.delegate设置代理

//MAConstraint

addConstraintWithLayoutAttribute:NSLayoutAttributeHeight];

//MSViewConstraint

*)addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute

{NSAssert(!self.hasLayoutRelation,

Attributes

relation);//delegate是MASConstraintMakerreturn

[self.delegate

addConstraintWithLayoutAttribute:layoutAttribute];

MASConstraintMaker

addConstraintWithLayoutAttribute:(NSLayoutAttribute)layoutAttribute

{...}

equalTo(MASBoxValue((__VA_ARGS__)))

(MASConstraint

self.equalToWithRelation(attribute,

(MASConstraint

self.equalToWithRelation(attribute,

MASViewConstraint

NSLayoutRelation))equalToWithRelation

{return

{//是数组有多个约束NSAssert(!self.hasLayoutRelation,

Redefinition

copy];viewConstraint.layoutRelation

relation;viewConstraint.secondViewAttribute

attr;//

addObject:viewConstraint];}MASCompositeConstraint

*compositeConstraint

initWithChildren:children];compositeConstraint.delegate

constraint:self

shouldBeReplacedWithConstraint:compositeConstraint];return

else

{//单个约束NSAssert(!self.hasLayoutRelation

self.layoutRelation

relation;self.secondViewAttribute

attribute;//

(void)setSecondViewAttribute:(id)secondViewAttribute

{//判断类型if

setLayoutConstantWithValue:secondViewAttribute];}

else

initWithView:secondViewAttribute

layoutAttribute:self.firstViewAttribute.layoutAttribute];}

else

isKindOfClass:MASViewAttribute.class])

else

(void)setLayoutConstantWithValue:(NSValue

*)value

getValue:point];self.centerOffset

point;}

(void)setOffset:(CGFloat)offset

{self.layoutConstant

(void)setSizeOffset:(CGSize)sizeOffset

{NSLayoutAttribute

self.firstViewAttribute.layoutAttribute;switch

(layoutAttribute)

NSLayoutAttributeWidth:self.layoutConstant

NSLayoutAttributeHeight:self.layoutConstant

sizeOffset.height;break;default:break;}

(void)setCenterOffset:(CGPoint)centerOffset

{NSLayoutAttribute

self.firstViewAttribute.layoutAttribute;switch

(layoutAttribute)

NSLayoutAttributeCenterX:self.layoutConstant

NSLayoutAttributeCenterY:self.layoutConstant

centerOffset.y;break;default:break;}

(void)setInsets:(MASEdgeInsets)insets

{NSLayoutAttribute

self.firstViewAttribute.layoutAttribute;switch

(layoutAttribute)

NSLayoutAttributeLeading:self.layoutConstant

NSLayoutAttributeTop:self.layoutConstant

NSLayoutAttributeBottom:self.layoutConstant

NSLayoutAttributeTrailing:self.layoutConstant

-insets.right;break;default:break;}

offset

(void)setOffset:(CGFloat)offset

{self.layoutConstant

*)mas_makeConstraints:(void(^)(MASConstraintMaker

*make))block

mas_makeConstraints:block]];}return

constraints;}该方法用于为一个包含多个视图的数组设置约束。

具体地这个方法会遍历数组中的每个视图并对每个视图调用其自身的

mas_makeConstraints

块中可以使用这些方法来描述视图之间的相对位置、尺寸等信息。

mas_makeConstraints

for-in

类型如果不是则会抛出异常以保证该数组只包含视图对象。

接着我们将视图的

mas_makeConstraints



SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback