Swift开源:AXBadgeView - badge view 管理类

ygaa1077 7年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/41ba875a31c6bcaddd71ce719db786b4.jpg"></p>    <h2>介绍</h2>    <p><a href="/misc/goto?guid=4959734760204906645" rel="nofollow,noindex">AXBadgeView-Swift</a> 是一个badge view管理类,是之前我写的 <a href="/misc/goto?guid=4959734760335224946" rel="nofollow,noindex">AXBadgeView</a> 的Swift版本(以下的介绍中统一使用 <strong>AXBadgeView</strong> ),在新版本中没有太大的改动,主要的是把原有的功能实用swift实现了,使用方法是一样的。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4e44c8db72f34a465a8d3139548c2e54.gif"></p>    <p>AXBadgeView是一个badge view视图,继承于 <strong>UILabel</strong> ,子类的实现完成了UI的自动布局,自动计算content的bounds大小并可以通过指定 minSize 实现badge view最终的bounds大小。</p>    <p>AXBadgeView使用的是自动布局来控制显示的位置的,为什么要用自动布局呢?在我之前做的一个项目中,我使用的是第三方的badge view管理类,在GitHub上的星星还是很多的,但是我使用了之后发现,布局是有问题的,在发现问题之后我就去看了看源码,结果问题显而易见,那个类使用的不是自动布局。那么在这样一个对布局精准度要求较高的地方的话,使用自动布局可以减少很多布局上面的隐患,其实这点来说,我也推荐是用自动布局,因为自动布局的强大之处已经不用我来多说了。</p>    <p>AXBadgeView中怎样控制badge view显示的偏移量呢?通过设置badge instance的 offSets 属性来控制, offSets 的默认值采用了 CGFloat.max 和 CGFloat.min 两个值,max表示就是x的最大值或者y的最小值,min就用来表示x的最小值和y的最小值。 offSets 的默认值是 (CGFloat.max, CGFloat.min) ,表示x的最右边和y的最上边,也就是superView的右上角。那么,在使用的过程中,如果想表示边界值的话就通过以上两个值来表示,就不用手动去计算superView的高宽了。同样的,如果想给定指定的 offSets 值的话,就可以设置这个属性,坐标系就是iOS的默认坐标系。</p>    <h2>特性</h2>    <p>以上已经对 <strong>AXBadgeView</strong> 做了一定的介绍了,那么这里将做一些总结性的东西,出了以上介绍的几点之外, <strong>AXBadgeView</strong> 还具有以下特性:</p>    <ul>     <li>设置数字显示 99+ 的样式,可以自定义显示的数字.</li>     <li>自定义显示的样式.</li>     <li>自定义动画效果.</li>     <li>当内容为 0 的时候可以设置隐藏.</li>     <li>当内容更新的时候,是否动画更新内容.</li>    </ul>    <h2>样式</h2>    <p>AXBadgeView默认提供了4样式,每一种样式显示的内容都有所区别,在使用的过程中可以根据需求设置不同的样式以达到不痛的效果。样式默认为: .Normal 。使用的过程中可以指定 style 来确定显示的样式和内容:</p>    <pre>  <code class="language-swift">enum AXBadgeViewStyle: Int {      /// Normal shows a red dot.      case Normal      /// Number shows a number form text.      case Number      /// Text shows a custom text.      case Text      /// New shows a new text.      case New  }</code></pre>    <ul>     <li>.Normal:显示小红点.</li>     <li>.Number:显示数字.</li>     <li>.Text:显示普通文本.</li>     <li>.New:显示 new 文本.</li>    </ul>    <p>通过代码实现更改样式:</p>    <p>objective-c:</p>    <pre>  <code class="language-swift">_showsView.badgeView.style = AXBadgeViewNew;</code></pre>    <p>swift:</p>    <pre>  <code class="language-swift">showsView.badgeView.style = AXBadgeViewStyle.New</code></pre>    <h2>动画</h2>    <p>AXBadgeView提供了4种动画,每一种动画都有不同的显示效果。在使用的过程中可以设置不同的动画类型来实现不同的显示效果。动画默认为 .None 即无动画,那么在设置相应的动画类型的话可以通过设置 animation 来指定响应的动画类型:</p>    <pre>  <code class="language-swift">enum AXBadgeViewAnimation: Int {      /// Animation none, badge view stay still.      case None      /// Animation scale.      case Scale      /// Animation shake.      case Shake      /// Animation bounce.      case Bounce      /// Animation breathe.      case Breathe  }</code></pre>    <ul>     <li>.None:默认,不显示任何动画.</li>     <li>.Scale:缩放动画.</li>     <li>.Shake:震动动画.</li>     <li>.Bounce:反弹动画.</li>     <li>.Breathe:渐变动画.</li>    </ul>    <p>代码示例:</p>    <p>objective-c:</p>    <pre>  <code class="language-swift">_showsView.badgeView.animation = AXBadgeViewAnimationScale</code></pre>    <p>swift:</p>    <pre>  <code class="language-swift">showsView.badgeView.animation = AXBadgeViewAnimation.Scale</code></pre>    <h2>API</h2>    <p>我在写这个工具类的时候就考虑到API友好的这个实际问题了,那么这样的一个工具应该怎样去设计它的API接口呢?在软件开发中,耦合度越低对我们整个项目的研发和维护是有很大帮助的,所以我们在设计一个API的时候,就要尽量去考虑到耦合度的因素。</p>    <p>AXBadgeView接口很简单,在使用的过程中过我们只需要关心 显示 和 隐藏 的接口就行了,其他的细节已经处理好了:</p>    <p>show(animated:inView:)</p>    <p>hide(animated:completion:)</p>    <p>AXBadgeView采用了协议和类扩展的形式,直接在 UIView 、 UIBarButtonItem 、 UITabBarItem 中直接添加并实现了相应的接口,使用起来很方便。在 <strong>OC</strong> 中使用了运行时添加 <strong>Associated Objects</strong> 的方式添加了 <strong>badgeView</strong> 属性和相关的饿方法。那么在 <strong>Swift</strong> 中的话就有点差别, <strong>Swift</strong> 中在添加了以上三个类的扩展以外,还实现了对应的协议:</p>    <pre>  <code class="language-swift">protocol AXBadgeViewDelegate {      /// Badge view property.      var badgeView: AXBadgeView {get set}      /// Animated to show the badge view.      func showBadge(animated animated: Bool) -> Void      /// Animated to hide the badge view.      func clearBadge(animated animated: Bool) -> Void  }</code></pre>    <h2>怎样接入我的项目?</h2>    <h2>源文件</h2>    <p>直接引用就是直接在GitHub下载代码源文件 <a href="/misc/goto?guid=4959734760204906645" rel="nofollow,noindex">AXBadgeView-Swift</a> -----> <a href="/misc/goto?guid=4959734760335224946" rel="nofollow,noindex">Objective-C版</a> ,并将下载的源文件导入工程:</p>    <ol>     <li> <p>swift直接使用.</p> </li>     <li> <p>oc在需要使用的地方 #import "AXBadgeView.h" .</p> </li>    </ol>    <h2>CocoaPods</h2>    <p><a href="/misc/goto?guid=4958869288453138992" rel="nofollow,noindex">CocoaPods</a> 依赖管理是比较使用起来比较方便的一种方式,只需要添加相应的依赖描述,便可直接接入现有项目:</p>    <ol>     <li>添加pod描述到你的Podfile问家里边: pod 'AXPopoverView', '~> 0.1.0'</li>     <li>运行安装命令: pod install .</li>     <li>- swift直接使用.      <ul>       <li>oc在需要使用的地方 #import "AXBadgeView.h" .</li>      </ul> </li>    </ol>    <h2>License</h2>    <p>This code is distributed under the terms and conditions of the <a href="/misc/goto?guid=4959734760509113869" rel="nofollow,noindex">MIT license</a> .</p>