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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图层几何学 -- iOS Core Animation 系列二

發布時間:2025/3/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图层几何学 -- iOS Core Animation 系列二 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

《圖層樹和寄宿圖 -- iOS Core Animation 系列一》介紹了圖層的基礎知識和一些屬性方法。這篇主要內容是學習下圖層在父圖層上怎么控制位置和尺寸的。

1.布局

首先看一張例圖:

對于圖上的frame、bounds、center、postion的概念我就不贅述了。如果有不明白的自行搜索下了解一下。

frame代表了圖層的外部坐標(也就是在父圖層上占據的空間),bounds是內部坐標({0, 0}通常是圖層的左上角),center和position都代表了相對于父圖層anchorPoint所在的位置

視圖的frame、bounds、center屬性僅僅是存取方法,當操縱視圖的frame時,實際上是在改變視圖對應的CALayer的frame, 不能獨立于圖層之外改變視圖的frame.

如果對圖層做了變換,比如旋轉縮放等。frame的值實際指的是圖層旋轉之后整個軸對齊的矩形區域。此時frame的寬高可能和bounds的寬高不一致:


2.錨點

默認來說,anchorPoint位于圖層的中點。這個屬性沒有被UIView直接暴露出來。但是圖層的anchorPoint可以被移動。我們可以把anchorPoint置于圖層frame的左上角。將會出現下圖右側的情況:

注意上圖,改變anchorPoint后position的值并沒變。

和系列一中提到的contentsRect類似,anchorPoint用單位坐標來表示(默認情況是{0.5, 0.5})。可以通過指定x和y值小于0或者大于1,使它放置在圖層范圍之外。

2.1 示例

為了學習這個anchorPoint屬性,下面創建一個鬧鐘的示例demo。
資源文件我是從原文上截圖下來的


創建4個UIImageView并設置好約束(都是居中顯示)。


我們用NSTimer來更新鬧鐘,使用視圖的transform屬性來旋轉鐘表。
代碼如下:

@interface ViewController () @property (nonatomic, weak) IBOutlet UIImageView *hourHand; @property (nonatomic, weak) IBOutlet UIImageView *minuteHand; @property (nonatomic, weak) IBOutlet UIImageView *secondHand; @property (nonatomic, weak) NSTimer *timer; @end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tick) userInfo:nil repeats:YES];[self tick]; } - (void)tick {//獲取對應的hours mins secondsNSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];NSUInteger units = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];CGFloat hoursAngle = (components.hour / 12.0) * M_PI * 2.0;CGFloat minsAngle = (components.minute / 60.0) * M_PI * 2.0;CGFloat secsAngle = (components.second / 60.0) * M_PI * 2.0;//旋轉對應的視圖self.hourHand.transform = CGAffineTransformMakeRotation(hoursAngle);self.minuteHand.transform = CGAffineTransformMakeRotation(minsAngle);self.secondHand.transform = CGAffineTransformMakeRotation(secsAngle); }

運行項目如下圖:

除了指針圖片的位置,其他的都正常。
可能這時候我們最先想到的方法,是調整對應圖片的位置來解決。但是這樣的話,你可以試試,并不能解決問題。不用賣關子了。這時候就是要用到anchorPoint的時候。處理代碼如下:

// 在viewdidload中添加 self.secondHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f); self.minuteHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f); self.hourHand.layer.anchorPoint = CGPointMake(0.5f, 0.9f);

運行完美。


3. 坐標系

眾所周知,一個圖層的position依賴于父圖層的bounds,如果父圖層移動,所有子圖層也會跟著移動。
CALayer也給我們提供了一些獲取一個圖層的絕對位置的方法,或者相對于另一圖層的位置(而不是它當前父圖層的位置):

- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer; - (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer; - (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer; - (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer; 常規來說,一個圖層的postion位于父圖層的左上角,但在 Mac OS 中,通常位于左下角。

3.1 z坐標軸

和UIView的二維坐標不同,CALayer存在于一個三維空間中,它還提供了zPostion和anchorPointz屬性。
zPosition屬性大多數不常用,除了三維動畫之外,它最實用的功能是可以改變圖層的顯示順序。

3.2 zPosition演示代碼

我們演示下改變zPosition會怎么改變視圖的顯示順序。
首先我在SB中設置兩個視圖,如下圖:

如果我們不做任何操作,運行后,兩個視圖顯示的順序就是我們現在設置的這樣。但是假如我們對yellowView設置zPosition,哪怕很小的值,都會發現顯示的順序反了。

@interface ViewController () @property (weak, nonatomic) IBOutlet UIView *cyanView; @property (weak, nonatomic) IBOutlet UIView *yellowView;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.yellowView.layer.zPosition = 1.f; }

現在的顯示效果如下:

雖說圖層基本沒有厚度,但是我們也盡量不要設置zPosition = 0.01f之類的。因為浮點類型的四舍五入可能導致難以察覺的麻煩。

4. Hit Testing

雖說CALayer不關心響應鏈事件,但是它提供了一些方法讓我們處理事件-containsPoint:和-hitTest:。

4.1 -containsPoint:

-containsPoint:接受一個在本圖層坐標系下的CGPoint,如果這個點在圖層frame范圍內就返回YES.我們可以使用這個方法判斷是哪個圖層被觸摸了。

4.1.1 containsPoint 示例

代碼如下:

@interface ViewController () @property (weak, nonatomic) IBOutlet UIView *layerView; @property (nonatomic, strong) CALayer *blueLayer;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.blueLayer = [CALayer layer];self.blueLayer.frame = CGRectMake(20.f, 20.f, 100.f, 100.f);self.blueLayer.backgroundColor = [UIColor blueColor].CGColor;[self.layerView.layer addSublayer:self.blueLayer]; }- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {// 獲取觸摸點CGPoint point = [[touches anyObject] locationInView:self.view];// 轉換觸摸點在layerView的圖層的位置point = [self.layerView.layer convertPoint:point fromLayer:self.view.layer];// 判斷是否包含在layerview里面if ([self.layerView.layer containsPoint:point]) {point = [self.blueLayer convertPoint:point fromLayer:self.layerView.layer];if ([self.blueLayer containsPoint:point]) {NSLog(@"點擊藍色圖層");} else {NSLog(@"點擊了白色圖層");}} }

運行點擊可以在控制臺看到NSLog的輸出信息。

4.2. -hitTest:

-hitTest:方法同樣接受一個CGPoint參數,但是返回的是圖層本身,而不是BOOL類型。這使我們不用像-containsPoint:一樣每個子圖層去測試點擊的坐標。如果這個點是在最外面的圖層,則返回nil。

4.2.1 hitTest示例

把上面-containsPoint:示例的代碼下面的部分修改一下即可:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {// 獲取點擊點CGPoint point = [[touches anyObject] locationInView:self.view];// 獲取這個點所在的圖層CALayer *layer = [self.layerView.layer hitTest:point];if (layer == self.blueLayer) {NSLog(@"點擊藍色圖層");} else if (layer == self.layerView.layer) {NSLog(@"點擊了白色圖層");} } 嘗試修改self.layerView的zPosition,會有不同的結果。有興趣的可以自己測試一下。

-- 系列二完 --

總結

以上是生活随笔為你收集整理的图层几何学 -- iOS Core Animation 系列二的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 少妇中文字幕 | 久草网视频在线观看 | 国产精品色视频 | 免费av在线网站 | 麻豆传谋在线观看免费mv | 欧美综合一区二区三区 | 一区二区av在线 | www.中文字幕在线观看 | 婷婷综合五月天 | 超碰一区二区 | 成人动漫一区二区三区 | juliaann欧美二区三区 | 日本乱子伦 | 99热在| 欧洲亚洲成人 | 特黄特色大片免费 | a色网站| 国产精品一区二区麻豆 | 久色88 | 亚洲天堂国产 | 欧美国产一区二区在线观看 | 亚洲国产成人精品激情在线 | 337p粉嫩色噜噜噜大肥臀 | 亚洲深夜福利视频 | 精品日韩av | 婷婷一区二区三区四区 | 色噜噜狠狠一区二区三区果冻 | 国产乱子伦视频一区二区三区 | 亚洲精品一区二 | 最好看的2019中文大全在线观看 | 久久久久久久久久久免费 | 在线看日韩av | 一级免费观看视频 | 日韩在线免费观看视频 | av成人精品| 亚洲色图88 | av影音先锋 | 国产视频久久久 | 久久欲| 欧美香蕉 | 精品无码免费视频 | 久久国产精品免费观看 | 无码人妻精品一区二区三区66 | 亚洲AV无码久久精品国产一区 | 国产美女喷水视频 | 免费成人在线观看动漫 | 亚州精品国产精品乱码不99按摩 | 粉嫩av网站 | 女人18毛片一区二区三区 | 久久综合中文 | 亚洲午夜久久久久久久久红桃 | 亚洲欧美a| 黄色片链接 | 日韩tv| 久久人妻精品白浆国产 | 激情小说一区 | 日本一区二区三区视频在线 | 色婷婷天堂| 嫩草综合 | 国产一区二区视频在线免费观看 | 日韩国产二区 | 野花视频免费在线观看 | 日日久| www.色悠悠 | 免费91看片 | jjzz日本视频 | 日韩在线视频在线观看 | 国产精品久久久久久久久久免费 | 国产第一精品视频 | 少妇人妻好深好紧精品无码 | 五月天婷婷丁香花 | 九九视频这里只有精品 | 欧美亚洲免费 | 日日操夜夜草 | 久久精品国产亚洲 | 久久国产欧美日韩精品 | 青青草原国产 | 欧美福利小视频 | 久热草| 91女神在线 | 亚洲高清中文字幕 | 国产一区综合 | 精品韩国一区二区三区 | 中文字幕欧美人妻精品 | 四虎com| 成人一区二区在线观看 | 国产精品白嫩极品美女 | 尤物视频一区 | 91大片免费看 | 免费视频91蜜桃 | 日本一区二区不卡在线 | 欧美一区二区三区影院 | 大桥未久在线视频 | 亚洲操操操 | 青青青国内视频在线观看软件 | 色男人影院| 99热在线看| 国产精品一区二区小说 | 日韩在线高清视频 |