你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> 換一個姿勢寫界面樣式

換一個姿勢寫界面樣式

編輯:IOS開發基礎

23.jpg

該組件GitHub地址

據說一個終端開發人員將會有70%以上的時間在和UI打交道。自己想想也對,貌似有很大一部分時間花費在了調整UI樣式,addSubView還有layout上面。猛然間就發現自己的代碼中有大量這種東西存在

    self.label.layer.cornerRadius = 3;
    self.label.textColor = [UIColor darkTextColor];
    self.label.font = [UIFont systemFontOfSize:13];
    self.label.backgroundColor = [UIColor greenColor];
    self.label.layer.borderWidth = 2;
    self.label.layer.borderColor = [UIColor redColor].CGColor;


    self.label2.layer.cornerRadius = 3;
    self.label2.textColor = [UIColor darkTextColor];
    self.label2.font = [UIFont systemFontOfSize:13];
    self.label2.backgroundColor = [UIColor greenColor];
    self.label2.layer.borderWidth = 2;
    self.label2.layer.borderColor = [UIColor redColor].CGColor;


    self.button.layer.cornerRadius = 3;
    self.button.backgroundColor = [UIColor greenColor];
    self.button.layer.borderWidth = 2;
    self.button.layer.borderColor = [UIColor redColor].CGColor;

    self.aView.layer.cornerRadius = 3;
    self.aView.backgroundColor = [UIColor greenColor];
    self.aView.layer.borderWidth = 2;
    self.aView.layer.borderColor = [UIColor redColor].CGColor;
    ......

上面的代碼是為了實現這樣的效果而寫的代碼。

很多幾乎是一毛一樣的代碼,充斥著整個APP。自己花在這些樣式調整上的時間也非常多。為了實現一個樣式效果,需要配置各種各樣的屬性。而且很多界面中這些樣式都是一樣的。於是又是無數次的重復上面的工作。oy my god!時間啊,就這樣流走了。做為一個懶人,就會發問有沒有一種可以少寫點代碼的方式呢?你可以寫一個子類嘛,但是會有類污染的問題,單純為了一個公有樣式,就創建個子類有點大材小用。那寫一批樣式渲染的函數呗,恩這個注意不錯,但是細想一下工作量也不小,而且不通用。於是,花了幾天的時間我寫了StyleSheet這個庫。為了的就是來簡化UI樣式的編碼。

通過上述描述我們可以發現,原始的寫UI樣式的問題:

  1. 繁瑣的代碼,大量重復性的工作

  2. 樣式無法共享,每一個View都需要重新進行樣式賦值。

而StyleSheet的設計目標就是:

  1. 樣式配置輕便化,能夠使用更加少的代碼來描述View的樣式

  2. 樣式在View之間的共享.不止是相同類的實例之間的共享,甚至是跨類的共享。

So,先看看上述代碼使用StyleSheet之後的效果:

self.label.style = DZLabelStyleMake(
  style.backgroundColor = [UIColor greenColor];
  style.cornerRedius = 3;
  style.borderColor = [UIColor redColor];
  style.borderWidth = 2;
  style.textStyle.textColor = [UIColor darkTextColor];
  style.textStyle.font = [UIFont systemFontOfSize:13];
);
self.label2.style = self.label.style;
self.aView.style = self.label.style;
[self.button.style copyAttributesWithStyle:self.label.style];

設計與使用

在設計StyleSheet的時候故意淡化了被渲染的View的類型的概念,任何一種類型的Style可以對任何類型的View進行渲染,但是必須是這種類型的View支持Style所指稱的屬性。比如你可以使用真對Button設計的DZButtonStateStyle來渲染一個UILabel,但由於UILabel不支持DZButtonStateStyle中的渲染屬性,所以渲染結果是無效的。

但是當使用DZButtonStyle(繼承自DZViewStyle)來渲染UILabel的時候,會使用DZButtonStyle中其父類的某些渲染屬性,來渲染UILabel的父類UIView所支持的那些屬性。

使用

直接使用Style對View進行渲染:

DZLabelStyle* style =DZLabelStyleMake(
    style.backgroundColor = [UIColor greenColor];
    style.cornerRedius = 3;
    style.borderColor = [UIColor redColor];
    style.borderWidth = 2;
    style.textStyle.textColor = [UIColor darkTextColor];
    style.textStyle.font = [UIFont systemFontOfSize:13];
);
[style decorateView:self.label];

直接渲染的好處是,不用再次生成Style對象,更加方便樣式在多個View之間渲染。

賦值渲染

對UIKit中常用的一些組件進行了擴張為他們增利了style屬性,直接進行style屬性的賦值,會出發一次渲染操作。當第一次調用style屬性的時候,會自動生成一個zeroStyle並賦值。

self.label.style = style;

或者

self.label.style = DZLabelStyleMake(
    style.backgroundColor = [UIColor greenColor];
    style.cornerRedius = 3;
    tyle.borderColor = [UIColor redColor];
    style.borderWidth = 2;
    style.textStyle.textColor = [UIColor darkTextColor];
    style.textStyle.font = [UIFont systemFontOfSize:13];
);

當進行賦值渲染的時候,會將Style的Copy後的實例與當前View綁定,當更改Style的屬性的時候,對應View的樣式會立刻改變。

通用樣式的共享

使用原有的配置,進行通用樣式的共享是個非常困難的事情,基本上都是體力活,靠人力來維護。我們的代碼中會摻雜大量的用於配置樣式的代碼,而且是獨立且散在。

現在你可以通過StyleSheet解決:

定義共享的樣式:

//在頭文件中使用 xxx.h 聲明一個公有樣式
EXTERN_SHARE_LABEL_STYLE(Content)

//在實現文件中使用 xxx.m ,實現一個公有樣式
IMP_SHARE_LABEL_STYLE(Content,
   style.backgroundColor = [UIColor clearColor];
   style.cornerRedius = 2;
   style.textStyle.textColor = [UIColor redColor];
)

(1)使用共享樣式,方式一

self.label.style =  DZStyleContent();

(2)使用共享樣式,方式二(推薦)

很多時候, 如果不需要進一步更改樣式,可以不采復制賦值的方式來進行渲染,可以直接使用:

[DZStyleContent() decorateView:self.label];
好了,現在可以嘗試著換這種方式來寫UI樣式了。

該組件GitHub地址

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved