亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

深入解析iOS應用開發中九宮格視圖布局的相關計算方法

2020-07-26 03:26:20
字體:
來源:轉載
供稿:網友

來看一個簡單的例子:

復制代碼 代碼如下:

/*
 * 總列數
 */
NSUInteger totalloc = 3;

/*
 * View的寬高
 */
CGFloat shopW = 80;
CGFloat shopH = 100;

/*
 * 每個View之間的間隔
 */
CGFloat margin = (self.view.frame.size.width - totalloc * shopW) / (totalloc + 1);

/*
 * View的總個數
 */
NSUInteger count = 12;

/*
 *  根據總個數使用總列數來除和取余獲取對應的行和列
 */
NSUInteger loc = count / totalloc;
NSUInteger row = count % totalloc;

/*
 * View的X和Y
 */
CGFloat shopX = margin + (margin + shopW) * row;
CGFloat shopY = margin + (margin + shopH) * loc;


/*
 * 創建自定義View,設置背景顏色,添加到界面上去
 */
 UIView *shopV = [[UIView alloc] initWithFrame:CGRectMake(shopX, shopY, shopW, shopH)];
 shopV.backgroundColor = [UIColor lightGrayColor];
 [self.shopView addSubview:shopV];

/*
 *  創建UIImageView用于放置圖片,設置frame然后加到自定義的View上面
 */
 UIImageView *imageV = [[UIImageView alloc] init];
 imageV.frame = CGRectMake(0, 0, 80, 80);
 [shopV addSubview:imageV];

/*
 *  創建UILabel用于放置顯示文字,設置frame然后加到自定義的View上面
 */
 UILabel *l = [[UILabel alloc] init];
 l.frame = CGRectMake(0, 80, 80, 20);
 l.textAlignment = NSTextAlignmentCenter;
 [shopV addSubview:l];


201631092901907.jpg (473×427)

根據例子可以看出設置九宮格的幾個要點步驟,下面我們再進一步深入探究尺寸和坐標方面的相關計算。比如現在我們有一個UIView,和一個button,當點擊button的時候,我們希望能在這個view上以九宮格的形式添加它的子view。
這里主要是記錄一下實現的思路,以后類似的問題都可以這樣思考。

201631092503014.png (600×390)

如圖,我們首先要計算的應該是horizalSpacing 和 verticalSpacing,因為拿到它們才可以計算坐標值。

很明顯這個容器view的大小是固定的,每一個子view的大小也是固定的,所以可以拿到horizalSpacing和verticalSpacing的值,并且是通過動態計算,因為這樣才能保證,當容器view或者子view的大小改變時,計算出的間距仍然是等大的。

這里首先要定義需要用到的常量:

復制代碼 代碼如下:

#define ITEM_WIDTH 80.0
#define ITEM_HEIGHT 80.0
#define COLS_COUNT 3
#define ROWS_COUNT 3

當點擊button的時候,會觸發addItemView的方法,就在這個方法里面計算水平和垂直間距:
復制代碼 代碼如下:

- (IBAction)addItemView
{
    CGFloat horizalSpacing = (self.bigView.bounds.size.width - COLS_COUNT * ITEM_WIDTH) / (COLS_COUNT - 1);
    CGFloat verticalSpacing = (self.bigView.bounds.size.height - ROWS_COUNT * ITEM_HEIGHT) / (ROWS_COUNT - 1);
}

以horizalSpacing為例:

首先拿到容器view的總寬度:self.bigView.bounds.size.width

因為一行有三個item,每個item的寬度已知,所以可以計算出三個item占據的寬度:COLS_COUNT * ITEM_WIDTH

用總寬度減去三個item占據的寬度,剩下的空間就是總間距。

因為每一行有三個item,那么就會產生兩個間距。同理,一行有n個item,那么就會產生n-1個間距。

有了總間距,知道了共有多少個間距,那么每個間距占據多少就可以求出來,所以求出了horizalSpacing。

verticalSpacing同理。

有了水平和垂直item間的間距,我們就可以計算item的坐標:

第一個item: X1 = (ITEM_WIDTH + horizalSpacing) * 0, Y1 = 0
第二個item: X2 = (ITEM_WIDTH + horizalSpacing) * 1, Y1 = 0
第三個item: X3 = (ITEM_WIDTH + horizalSpacing) * 2, Y1 = 0

第四個item: X1 = (ITEM_WIDTH + horizalSpacing) * 0, Y2 = (ITEM_HEIGHT + verticalSpacing) * 1
第五個item: X2 = (ITEM_WIDTH + horizalSpacing) * 1, Y2 = (ITEM_HEIGHT + verticalSpacing) * 1
第六個item: X3 = (ITEM_WIDTH + horizalSpacing) * 2, Y2 = (ITEM_HEIGHT + verticalSpacing) * 1

...
可以看到,x和y坐標都是有規律的:

x坐標是通過

 (ITEM_WIDTH + horizalSpacing) * index // 這里的index就是圖中item的編號
但是當到第四個item的時候,又需要重復新一輪的index的值。

復制代碼 代碼如下:

0 % 3 = 0, 1 % 3 = 1, 2 % 3 = 2
3 % 3 = 0, 4 % 3 = 1, 5 % 3 = 2
6 % 3 = 0, 7 % 3 = 1, 8 % 3 = 2

可以看到,是和上面進行的模運算是一個規律,所以我們就可以將代碼寫成這樣來計算x的值:
復制代碼 代碼如下:

- (IBAction)addItemView
{
      NSUInteger index = self.bigView.subviews.count; // 新增

    CGFloat horizalSpacing = (self.bigView.bounds.size.width - COLS_COUNT * ITEM_WIDTH) / (COLS_COUNT - 1);
    CGFloat verticalSpacing = (self.bigView.bounds.size.height - ROWS_COUNT * ITEM_HEIGHT) / (ROWS_COUNT - 1);

      CGFloat x = (ITEM_WIDTH + horizalSpacing) * (index % COLS_COUNT); // 新增
}


在這里計算index并沒有采用單獨定義一個計數器,每次點擊后計數器加1這種方式,而是通過計算容器view的子view的個數。很明顯,第一次點擊前index = 0。(之后會定義view然后加到bigView中,這時bigView的子view就會+1了。)

同理,y值可以采用同樣的方法計算,不過要注意并非是進行取模計算,而是通過除法。(看一下每個item的序號并且和規律對應上,就會發現是用除法。)

復制代碼 代碼如下:

- (IBAction)addItemView
{
      NSUInteger index = self.bigView.subviews.count;

    CGFloat horizalSpacing = (self.bigView.bounds.size.width - COLS_COUNT * ITEM_WIDTH) / (COLS_COUNT - 1);
    CGFloat verticalSpacing = (self.bigView.bounds.size.height - ROWS_COUNT * ITEM_HEIGHT) / (ROWS_COUNT - 1);

      CGFloat x = (ITEM_WIDTH + horizalSpacing) * (index % COLS_COUNT);
    CGFloat y = (ITEM_HEIGHT + verticalSpacing) * (index / COLS_COUNT); // 新增
}


拿到每次view的坐標,并且已知大小,就可以完成了。

復制代碼 代碼如下:

- (IBAction)addItemView
{
      NSUInteger index = self.bigView.subviews.count;

    CGFloat horizalSpacing = (self.bigView.bounds.size.width - COLS_COUNT * ITEM_WIDTH) / (COLS_COUNT - 1);
    CGFloat verticalSpacing = (self.bigView.bounds.size.height - ROWS_COUNT * ITEM_HEIGHT) / (ROWS_COUNT - 1);

      CGFloat x = (ITEM_WIDTH + horizalSpacing) * (index % COLS_COUNT);
    CGFloat y = (ITEM_HEIGHT + verticalSpacing) * (index / COLS_COUNT);

    UIView *item = [[UIView alloc] initWithFrame:CGRectMake(x, y, ITEM_WIDTH, ITEM_HEIGHT)]; // 新增
    item.backgroundColor = [UIColor redColor];  // 新增
    [self.bigView addSubview:item];  // 新增
}


不僅僅是九宮格,無論改變item的大小還是bigView的大小,或者改變每一行每一列的item個數,都可以很好的計算出每個item合適的大小和位置。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久91精品国产一区不卡| 性色av一区二区咪爱| 日本aⅴ大伊香蕉精品视频| 中文在线不卡视频| 欧美性猛交xxxx富婆弯腰| 亚洲欧美成人在线| 最新91在线视频| 国产精品久久97| 成人激情视频在线播放| 欧美日韩成人在线视频| 欧美亚州一区二区三区| 欧美俄罗斯乱妇| 国产精品第一第二| 久久久久久久久久久成人| 国产91精品久久久久久| 国产亚洲免费的视频看| 成人亲热视频网站| 在线观看精品自拍私拍| 2019中文字幕在线| 中日韩美女免费视频网站在线观看| 亚洲xxxx视频| 国产精品久久久久久婷婷天堂| 中文字幕在线观看亚洲| 国内精品中文字幕| 日韩精品高清在线| 亚洲成人久久一区| 欧美成人一区二区三区电影| 亚洲人成电影在线观看天堂色| 欧美激情极品视频| 揄拍成人国产精品视频| 国产精品久久国产精品99gif| 亚洲自拍偷拍色图| 国产精品视频区1| 亚洲欧美另类人妖| 亚洲韩国欧洲国产日产av| 久久久久久亚洲精品| 欧美壮男野外gaytube| 精品国产一区二区在线| 国外色69视频在线观看| 国产91在线播放精品91| 精品无人区太爽高潮在线播放| 日韩av免费一区| 91在线观看免费| 国产精品丝袜白浆摸在线| 亚洲欧洲中文天堂| 成人疯狂猛交xxx| 亚洲精品小视频| 在线观看日韩www视频免费| 在线观看视频99| 在线精品视频视频中文字幕| 欧美亚洲午夜视频在线观看| 欧美成人h版在线观看| 日本亚洲欧洲色| 在线播放国产一区中文字幕剧情欧美| 成人黄色生活片| 国精产品一区一区三区有限在线| 91高清视频在线免费观看| 成人福利在线视频| 97精品视频在线播放| 国产精品欧美一区二区三区奶水| 亚洲老司机av| 中文字幕日韩精品在线观看| 国产精品久久久久久久久| 九九热r在线视频精品| 欧美激情喷水视频| 欧美丝袜美女中出在线| 久久激情视频久久| 日韩av手机在线看| 91国内精品久久| 国产精品成av人在线视午夜片| 55夜色66夜色国产精品视频| 亚洲专区中文字幕| 亚洲人成电影在线| 久久精品国产亚洲精品2020| 亚洲激情 国产| 精品一区二区亚洲| 欧美黑人一区二区三区| 欧美午夜无遮挡| 久久久99久久精品女同性| 亚洲欧美中文另类| 国产精品亚洲激情| 久久久久久中文字幕| 国产精品久久久久久久久久尿| 国产精品免费久久久久影院| 欧美性感美女h网站在线观看免费| 欧美专区国产专区| 久久人人爽亚洲精品天堂| 国产亚洲精品一区二555| 成人信息集中地欧美| 色偷偷噜噜噜亚洲男人| 久久久久久午夜| 国产日韩欧美成人| 亚洲天天在线日亚洲洲精| 亚洲国产古装精品网站| 久久av中文字幕| 午夜精品视频在线| 色琪琪综合男人的天堂aⅴ视频| 在线午夜精品自拍| 一个人www欧美| 国产91在线播放九色快色| 97香蕉超级碰碰久久免费软件| 97精品国产97久久久久久| 日本在线观看天堂男亚洲| 91精品在线一区| 亚洲欧美精品在线| 中文字幕日韩在线观看| 欧美有码在线视频| 亚洲欧美精品中文字幕在线| 欧洲精品毛片网站| 成人国产精品日本在线| 成人h视频在线| 在线看日韩av| 亚洲精品少妇网址| 欧美在线视频网| 黄色成人在线播放| 91大神福利视频在线| 欧美精品久久久久| 在线观看国产精品淫| 伊人男人综合视频网| 久热精品视频在线| 午夜精品蜜臀一区二区三区免费| 91高清免费在线观看| 中文字幕视频一区二区在线有码| 国精产品一区一区三区有限在线| 日韩最新在线视频| 福利视频第一区| 国产啪精品视频| 久久国产精品影视| 国产精品久久久久久久久久久久久久| 亚洲色图狂野欧美| 久久免费视频网站| 欧美激情在线观看视频| 国产成人精品999| 亚洲日本aⅴ片在线观看香蕉| 97视频人免费观看| 国产精品爽黄69天堂a| 亚洲欧美精品伊人久久| 久久99久久99精品免观看粉嫩| 另类视频在线观看| 欧美亚洲伦理www| 欧美在线免费看| 中国china体内裑精亚洲片| 国产精品视频专区| 欧美精品免费在线观看| 日韩av免费网站| 色噜噜狠狠狠综合曰曰曰88av| 中文字幕日韩欧美精品在线观看| 久久久久亚洲精品成人网小说| 中文字幕一区电影| 久久久久九九九九| 亚洲精品日产aⅴ| 国产一区二区三区视频在线观看| 亚洲美女av黄| 国产69久久精品成人看| 精品久久久久久久久久久久| 国产欧美精品一区二区三区-老狼| 亚洲一区美女视频在线观看免费| 亚洲国产成人久久综合| 亚洲精品视频在线播放| 97精品久久久中文字幕免费| 国产精品99一区| 久久综合免费视频| 欧美午夜宅男影院在线观看| 日韩欧美综合在线视频|