UIPopoverController繼承自NSObject,因此不具備顯示能力,它是通過其中的內容控制器顯示的內容的。
UIPopoverController使用四部曲:
一、創建UIPopoverController的內容控制器
二、根據內容控制器初始化UIPopoverController對象
三、設置UIPopoverController對象的尺寸
四、顯示UIPopoverController對象
顯示UIPopoverController對象有兩種方法:
方法一:通過點擊UIBarButtonItem按鈕顯示
- (void)PResentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
參數說明:
item:觸發顯示的UIBarButtonItem對象
arrowDirections:顯示的箭頭方向
animated:是否展示過渡動畫
方法二:對特定區域顯示
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
參數說明:
rect:箭頭指向的區域
view:rect對應的視圖
arrowDirections:顯示箭頭的方向
animated:是否展示過渡動畫
注意:
1、UIPopoverController對象的尺寸不建議寫死,應當根據內容控制器的需要來。ios7以前對內容控制器(UIViewController)的contentSizeForViewInPopover設值,ios7以后對內容控制器的preferredContentSize設值。
2、UIPopoverController對象顯示出來的時候,默認任何其他控件都是不能交互的,點擊UIPopoverController對象區域意外的部分,對象dismiss。若想UIPopoverController對象顯示的時候能和某個控件交互,可以通過設置passthroughViews屬性實現。它是一個數組對象,將需要交互的控件打包成數組復制給它即可。
ios7以后系統提供了CoreImage框架中生成二維碼的濾鏡方法。由C語言支持的第三方庫libqrencode也是不錯的選擇。見Demo
//顯示方式vc.modalPresentationStyle = UIModalPresentationFullScreen;//過渡方式vc.modalTransitionStyle = UIModalTransitionStylePartialCurl;
對于iphone而言,只考慮過渡方式。
對于ipad而言,兩者都可考慮,顯示方式比較常用的是UIModalPresentationFormSheet(占據中間一小塊)
可以直接在storyboard中設置tableView的頭視圖和尾視圖,拖出tableView到IB后,然后拖出視圖控件到tableView作為子視圖(tableView在IB中只允許有兩個子視圖,頭視圖和尾視圖,兩個視圖是連著的,頭在上尾在下)。只適用與storyboard,xib不適用,習慣用storyboard的話能夠大大提升開發效率。
另外可以直接在IB中對tableView設置代理和數據源。
NSStringDrawingTruncatesLastVisibleLine:
如果文本內容超出指定的矩形限制,文本將被截去并在最后一個字符后加上省略號。如果沒有指定NSStringDrawingUsesLineFragmentOrigin選項,則該選項被忽略。
NSStringDrawingUsesLineFragmentOrigin:
繪制文本時使用 line fragement origin 而不是 baseline origin。
NSStringDrawingUsesFontLeading:
計算行高時使用行距。(譯者注:字體大小+行間距=行距)
NSStringDrawingUsesDeviceMetrics:
計算布局時使用圖元字形(而不是印刷字體)。
測試發現:
只使用NSStringDrawingUsesLineFragmentOrigin時,以寬度約束為依賴,即使計算出的高度超過設定的約束高度,最終還是返回計算出的高度,也就是忽略高度的約束。
使用NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine時,如果計算的高度超過約束的高度,最終返回的高度是可容納最大行數的文本對應高度,比如約束的高度容納得下2行,容不下3行,則返回的Size高度是2行對應的高度。
總結用法:
計算時options參數使用
NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading
另外計算單行文本也可以直接使用sizeWithAttributes
topViewController代表當前navigation棧中最上層的VC,而visibleViewController代表當前可見的VC,它可能是topViewController,也可能是當前topViewController present出來的VC。因此UINavigationController的這兩個屬性通常情況下是一樣,但也有可能不同。
日歷主界面通過collectionView搭建,難點在于獲取指定月的日歷結構,包括這個月開頭有幾天是上個月的,末尾有幾天是下個月的,將這些信息通過不同的字符標識保存到數組中,例如*表示上個月的date、#表示下個月的date,中間本月用1~天數標識,就能得到指定月的日歷結構。
獲取到這個存有指定月日歷結構的數組是關鍵,有了它界面的搭建就有依據了。具體見Demo
值得一提的是,每個星期的第一天是星期日。因此如果日歷7天為一行的話,默認最左邊是星期日。如果想改為從左到右是星期一~星期日的結構,只要設置日歷對象calendar的FirstWeekday屬性值為2即可,(默認為1,從星期日開始)。
一字符串,字體大小15,計算好了size,顯示成兩行,行間距設置成3,打印計算出的高度為38.79。
打印字體大小15的font對象的各個屬性以及查看
leading*2 = 35.790000
lineHeight*2 = 35.790000
capHeight*2 = 21.420000
xHeight*2 = 15.510000
ascender*2 = 28.560000
descender*2 = -7.230000
lineSpacing = 3.000000(事先設置)
從數據可以看出:
(1)計算出的高度是以兩行行高(lineHeight)和一行行間距(lineSpacing)組成的。
(2)ascender是文本基線到文本頂部的距離,descender是文本底部到基線的距離(是負的),行高(lineHeight = ascender - descender)
(3)xHeight和capHeight不重要,具體可以查網上的那張字形度量圖,但是那張圖個人認為有問題,與實際測試打印的數據不符。leading就是lineHeight。
另外經測試發現,對于設置了行間距了文本
一行文本計算高度結果 = 文本高度+行間距
兩行文本計算高度結果 = 文本高度*2+行間距
三行文本計算高度結果 = 文本高度*3+行間距*2
四行....
如果未設置行間距的文本(文本默認行間距就是0),文本高度就是行高*行數
新聞熱點
疑難解答