日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义View相关

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义View相关 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(shí)現(xiàn)自定義View的關(guān)鍵是重載UIView的drawRect: 方法,因?yàn)橹饕峭ㄟ^重載這個(gè)方法,來改變view的外觀。

例如:

?

- (void)drawRect:(CGRect)rect
{
// 繪圖
CGRect bounds = [self bounds];
// Where is its center?
CGPoint center;
center.x = bounds.origin.x + bounds.size.width / 2.0;
center.y = bounds.origin.y + bounds.size.height / 2.0;
// From the center how far out to a corner?
float maxRadius = hypot(bounds.size.width, bounds.size.height) / 2.0;
// Get the context being drawn upon
CGContextRef context = UIGraphicsGetCurrentContext();
// All lines will be drawn 10 points wide
CGContextSetLineWidth(context, 10);
// Set the stroke color to light gray
[[UIColor lightGrayColor] setStroke];
// Draw concentric circles from the outside in
for (float currentRadius = maxRadius; currentRadius > 0; currentRadius -= 20)
{
CGContextAddArc(context, center.x, center.y,
currentRadius, 0.0, M_PI * 2.0, YES);
CGContextStrokePath(context);
}

// 繪文字
NSString *text = @"Hello,World!";
// Get a font to draw it in
UIFont *font = [UIFont boldSystemFontOfSize:28];
// Where am I going to draw it?
CGRect textRect;
textRect.size = [text sizeWithFont:font];
textRect.origin.x = center.x - textRect.size.width / 2.0;
textRect.origin.y = center.y - textRect.size.height / 2.0;
// Set the fill color of the current context to black
[[UIColor blackColor] setFill];
// Set the shadow to be offset 4 points right, 3 points down,
// dark gray and with a blur radius of 2 points
CGSize offset = CGSizeMake(4, 3);
CGColorRef color = [[UIColor darkGrayColor] CGColor];
CGContextSetShadowWithColor(context, offset, 2.0, color);
// Draw the string
[text drawInRect:textRect
withFont:font]; }


再說明一下重繪,重繪操作仍然在drawRect方法中完成,但是蘋果不建議直接調(diào)用drawRect方法,當(dāng)然如果你強(qiáng)直直接調(diào)用此方法,當(dāng)然是沒有效果的。

蘋果要求我們調(diào)用UIView類中的setNeedsDisplay方法,則程序會(huì)自動(dòng)調(diào)用drawRect方法進(jìn)行重繪。(調(diào)用setNeedsDisplay會(huì)自動(dòng)調(diào)用drawRect)
在UIView中,重寫drawRect: (CGRect) aRect方法,可以自己定義想要畫的圖案.且此方法一般情況下只會(huì)畫一次.也就是說這個(gè)drawRect方法一般情況下只會(huì)被掉用一次.?當(dāng)某些情況下想要手動(dòng)重畫這個(gè)View,只需要掉用[self setNeedsDisplay]方法即可.

drawRect調(diào)是在Controller->loadView, Controller->viewDidLoad 兩方法之后調(diào)用的.所以不用擔(dān)心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設(shè)置一些值給View(如果這些View draw的時(shí)候需要用到某些變量值).

1.如果在UIView初始化時(shí)沒有設(shè)置rect大小,將直接導(dǎo)致drawRect不被自動(dòng)調(diào)用。
2.該方法在調(diào)用sizeThatFits后被調(diào)用,所以可以先調(diào)用sizeToFit計(jì)算出size。然后系統(tǒng)自動(dòng)調(diào)用drawRect:方法。
3.通過設(shè)置contentMode屬性值為UIViewContentModeRedraw。那么將在每次設(shè)置或更改frame的時(shí)候自動(dòng)調(diào)用drawRect:。
4.直接調(diào)用setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個(gè)前提條件是rect不能為0.
以上1,2推薦;而3,4不提倡
1、若使用UIView繪圖,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個(gè)invalidate的ref并且不能用于畫圖。drawRect:方法不能手動(dòng)顯示調(diào)用,必須通過調(diào)用setNeedsDisplay 或者 setNeedsDisplayInRect ,讓系統(tǒng)自動(dòng)調(diào)該方法。
2、若使用calayer繪圖,只能在drawInContext: 中(類似于drawRect)繪制,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法。
3、若要實(shí)時(shí)畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實(shí)時(shí)刷新屏幕

附高人對UIView的drawRect: 和 - (void)setNeedsDisplay 的一些理解

在UIView中,

1、自定義畫圖,類似android的onDraw()

- (void)drawRect:(CGRect)rect;

?is invoked automaticall,never call it directly!!

2、刷新視圖,類似android的invalidate()

- (void)setNeedsDisplay;

When a view needs to be redrawn,use:?

3、在非主線程中調(diào)用,需使用如下方法:

????? - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait
?? ?? - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

4、setNeedsDisplay是不阻塞的,
?? ? 需要自己制造阻塞,
?? ? setNeedsDisplay我理解就是告訴系統(tǒng),等會(huì)幫哥把這塊重新畫一下。
???? 系統(tǒng)就知道了,等系統(tǒng)有空了,他就一起畫了,
?? ? 如果想立即畫出來,可能要用setNeedsLayout,
?? ? 或者不用drawInRect系列的方式,直接改view.image或者文字,加動(dòng)畫等方式實(shí)現(xiàn)吧。

5、setNeedsDisplay和layoutSubViews

???? 首先兩個(gè)方法都是異步執(zhí)行的。而setNeedsDisplay會(huì)調(diào)用自動(dòng)調(diào)用drawRect方法,這樣可以拿到UIGraphicsGetCurrentContext,就可以畫畫了。而setNeedsLayout會(huì)默認(rèn)調(diào)? 用layoutSubViews,就可以處理子視圖中的一些數(shù)據(jù)。
綜上所訴,setNeedsDisplay方便繪圖,而layoutSubViews方便出來數(shù)據(jù)。

?

轉(zhuǎn)載于:https://www.cnblogs.com/ranger-jlu/p/3957096.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的自定义View相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www欧美视频 | 欧美放荡性医生videos | 性综合网| 色视频免费| 成人羞羞国产免费游戏 | 中文在线字幕免费观看电 | 色久av| 亚洲一区二区三区色 | 国色天香网站 | 久久影业 | 欧美激情综合色综合啪啪五月 | 香蕉久久夜色精品国产使用方法 | 第一章婶婶的性事 | 一级全黄少妇性色生活片 | 五月天激情视频 | 日韩欧美精品在线观看 | 最近日韩中文字幕 | 高潮久久久 | 好吊操精品视频 | 女女综合网 | 成人影| 天天狠天天插 | 久久av在线 | 黄黄视频在线观看 | 成人综合婷婷国产精品久久 | 在线观看污污网站 | 俄罗斯av片 | 国产精品久久久爽爽爽麻豆色哟哟 | 激情四射综合网 | 日韩欧美电影一区二区三区 | 日韩区在线观看 | 精品无码国产av一区二区三区 | 成片免费观看视频 | 国产精品爱啪在线线免费观看 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲性精品 | 想要视频在线 | 免费色网址| 欧美另类z0zx974 | 中文字幕一区二区三区人妻不卡 | 国产乱码一区二区三区在线观看 | 一区二区三区四区国产精品 | 蜜桃av成人永久免费 | 一区二区三区亚洲精品 | 免费在线你懂的 | 日韩在线一区视频 | 福利网站在线观看 | 好看的av在线 | 成人国产精品蜜柚视频 | 天天做天天爽 | 国模在线| 亚州福利 | 懂色一区二区三区免费观看 | 精品91av| 亚洲小视频在线观看 | 网友自拍咪咪爱 | 免费毛片视频 | 亚洲29p| 无码久久精品国产亚洲av影片 | 精品少妇人妻av一区二区 | 91精品一区| 色视频网站在线观看 | 久热精品在线观看视频 | 欧美精品久久96人妻无码 | 精品久久久久久久久久久久久 | 综合 欧美 亚洲日本 | 91激情在线观看 | 国产suv精品一区二区60 | 狠狠干in | 日韩一区三区 | 日本成人久久 | 中文字幕亚洲无线码在线一区 | 17c国产精品一区二区 | 欧洲精品一区二区三区久久 | 公侵犯一区二区三区 | 二级黄色片 | 中国av毛片 | 日韩国产综合 | 成人在线观看18 | 国产日本一区二区 | 欧洲黄色网| 亚洲女人初尝黑人巨大 | 菲律宾黄色片 | 在线观看wwww| 中国女人真人一级毛片 | 在线观看欧美 | 51自拍视频 | 国产伦乱视频 | 国产成人精品久久久 | 欧美精品在线免费观看 | 天堂一区二区三区四区 | 成人黄色免费看 | 少妇激情在线 | 亚洲视频在线观看一区 | 国产欧美日韩综合精品一区 | 激情www| 蜜桃视频久久一区免费观看入口 | 成人在线你懂的 | 久久亚洲婷婷 |