Masonry 關於ScrollView的使用
問題描述
開發中遇到了關於Masonry對於Scrollview的contentSize的設定問題。通過閱讀Masonry的原始碼,我最終找到了我想要的方法。
其實問題很簡單,也因為我個人對於Masonry使用還不夠熟練(平時用stb挺多。。)。
實際情況是這樣的,我要在一個簡單的檢視中顯示一個標題,一個時間,還有一個文字內容,文字內容不定,可能會很多,多到超出這個螢幕,由於是很固定的螢幕佈局,我採用的方式是,ScrollView加上一個容器View(contentView), 還有三個label即可,三個label加到contentView上,使用Masonry進行佈局。
這裡涉及到contentSize的地方就是其中一個label是放置內容的我們叫做contentLabel,這個是多行顯示,高度不定,由於這個檢視是加到了contentView上,contentView的高度決定了ScrollView的contentSize,於是要做的就是保證contentLabel的高度動態變化的同時contentView的高度也要動態變化,才能夠保證超出螢幕之後,可以滑動檢視超出的內容文字。多餘的不說了,看程式碼吧。可能程式碼寫的不好,希望大家可以指正:flushed:
程式碼
@interface DemoVC ()
{
UIScrollView * _scrollView;
UIView * _contentView;
UILabel * _titleLabel;
UILabel * _timeLabel;
UILabel * _contentLabel;
}
@end
@implementation DemoVC
- (void)viewDidLoad {
[super viewDidLoad];
[self createView];
[self __layoutSubViews];
}
- (void)createView {
UIScrollView * scrollView = [[UIScrollView alloc] init];
scrollView.backgroundColor = [UIColor groupTableViewBackgroundColor];
[self.view addSubview:scrollView];
_scrollView = scrollView;
UIView * contentView = [[UIView alloc] init];
contentView.backgroundColor = [UIColor groupTableViewBackgroundColor];
[scrollView addSubview:contentView];
_contentView = contentView;
UILabel * titleLabel = [[UILabel alloc] init];
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.font = [UIFont systemFontOfSize:16.f];
titleLabel.textColor = CustomBlackColor;
[contentView addSubview:titleLabel];
_titleLabel = titleLabel;
UILabel * timeLabel = [[UILabel alloc] init];
timeLabel.textAlignment = NSTextAlignmentCenter;
timeLabel.font = [UIFont systemFontOfSize:11.f];
timeLabel.textColor = [UIColor lightGrayColor];
[contentView addSubview:timeLabel];
_timeLabel = timeLabel;
UILabel * contentLabel = [[UILabel alloc] init];
contentLabel.numberOfLines = 0;
contentLabel.font = [UIFont systemFontOfSize:14.f];
contentLabel.textColor = [UIColor darkGrayColor];
contentLabel.backgroundColor = [UIColor clearColor];
[contentView addSubview:contentLabel];
_contentLabel = contentLabel;
}
- (void)__layoutSubViews {
[_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view);
}];
[_contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_scrollView);
make.width.equalTo(_scrollView);
make.height.greaterThanOrEqualTo(@0.f);//此處保證容器View高度的動態變化 大於等於0.f的高度
}];
[_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_contentView).offset(20.f);
make.left.equalTo(_contentView).offset(10);
make.right.equalTo(_contentView).offset(-10);
make.height.equalTo(@16.f);
}];
[_timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_titleLabel.mas_bottom).offset(5.f);
make.left.equalTo(_contentView).offset(10);
make.right.equalTo(_contentView).offset(-10);
make.height.equalTo(@16.f);
}];
[_contentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(_timeLabel.mas_bottom).offset(20.f);
make.left.equalTo(_contentView).offset(10);
make.right.equalTo(_contentView).offset(-10);
make.bottom.equalTo(_contentView).offset(-10);// 設定與容器View底部高度固定,contentLabel高度變化的時候,由於設定了容器View的高度動態變化,底部距離固定。 此時contentView的高度變化之後,ScrollView的contentSize就發生了變化,適配文字內容,滑動檢視超出螢幕文字。
// make.height.greaterThanOrEqualTo(@16.f);//高度動態變化 大於等於16
}];
_titleLabel.text = @"測試效果";
_timeLabel.text = @"2015.09.09";
_contentLabel.text = @"為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)為什麼要預設向上的陰影呢?儘管Core Animation是從圖層套裝演變而來(可以認為是為iOS建立的私有動畫框架),但是呢,它卻是在Mac OS上面世的,前面有提到,二者的Y軸是顛倒的。這就導致了預設的3個點位移的陰影是向上的。在Mac上,shadowOffset的預設值是陰影向下的,這樣你就能理解為什麼iOS上的陰影方向是向上的了(如圖4.5)";
}
相關文章
- 關於 Masonry 的一些思考(下)
- Masonry 使用方法整理
- 關於Remix的使用REM
- iOS Masonry 一些日常使用方法iOS
- 原始碼閱讀:Masonry(一)——從使用入手原始碼
- Android中RecyclerView與Scrollview組合使用(二)AndroidView
- Android關於Typedarray的使用Android
- 關於Validation的方法使用
- java 關於fileinputstream的使用Java
- 關於pcl索引的使用索引
- ScrollView巢狀RecyclerView滑動衝突相關問題View巢狀
- vue3 瀑布流 vue-masonry使用方法Vue
- 同時使用 IB 和 Masonry 時,如何刪除 NSIBPrototypingLayoutConstraintAI
- 關於socket.io的使用
- 關於公眾號的使用
- 關於 Jupyter 的使用說明
- 關於JSON的簡單使用JSON
- 關於MySQL使用的時長MySql
- mybatis關於list的foreach的使用MyBatis
- ScrollView 觸控事件View事件
- Android Webview和ScrollView衝突和WebView使用總結AndroidWebView
- Masonry原始碼解讀原始碼
- (轉)git中關於fetch的使用Git
- 關於WPF進度條的使用
- 關於虛擬機器的使用虛擬機
- Windows 關於Robocopy的使用詳解Windows
- 關於GJSON包的簡單使用JSON
- QT5.9關於QMenuBar的使用QT
- Android帶有粘性頭部的ScrollViewAndroidView
- 看完 `Masonry` 原始碼後的幾點思考?原始碼
- Masonry 原始碼解讀(下)原始碼
- Masonry 原始碼解讀(上)原始碼
- Masonry 原始碼學習整理原始碼
- Masonry動畫更新約束動畫
- IOS基礎-Masonry 練習iOS
- 關於高效使用Python字典的清單Python
- 關於iOS開發中copy的使用iOS
- 關於Apache Tika的學習和使用Apache
- 關於Android Studio使用Git的總結AndroidGit