我處在一個困境,哪個方法用於設置自定義UIViews框架與許多子視圖,並仍然有動畫和自動調整旋轉。我最常做的,當我創建一個新的視圖 - 控制的頁頭中的loadView或viewDidLoad中我的自定義視圖,例如:自定義UIView佈局與方向和動畫的子視圖?
-(void)viewDidLoad
{
[super viewDidLoad];
detailView = [[DetailView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
detailView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.view = detailView;
}
通常這個寬度&高度不爲iPhone5的屏幕正確的(實際視圖幀不設置,直到viewWillAppear),但由於autoresizingmask它一切運作。
然後在自定義的UIView的DetailView的initWithFrame,我ALLOC所有子視圖與CGRectZero,e.g:
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
label = [[UILabel alloc] initWithFrame:CGRectZero];
[self addSubview:label];
}
}
然後我重寫layoutsubviews設置所有子視圖的所有幀。這完全適用於任何屏幕大小和任何方向,如:
-(void)layoutSubviews
{
[super layoutSubviews];
label.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
不過,我剛剛發現layoutSubviews不是那麼大,當你使用動畫,因爲當你在animationblock使用動畫,layoutsubviews被稱爲動畫的中間,它徹底打破了動畫,如:
-(void)animateLabel
{
[UIView animateWithDuration:0.4f animations:^
{
label.transform = CGAffineTransformMakeTranslation(100, 100);
}];
}
我相信有醜陋的解決方法這通過使用標誌爲每個動畫和layoutsubviews使用這些標誌設置動畫的正確的開始或endframe但我認爲我不應該爲每個我想要做的動畫創建一個標誌。
所以我的問題是現在:我應該如何有一個自定義UIView動畫,也可以自動調整自己旋轉?
我現在可以提出的唯一解決方案(我不喜歡): 不要使用layoutSubviews,而是使用自定義UIView的setFrame/setBounds方法來設置所有子視圖的框架。然後在每次發生旋轉時檢查viewController,然後使用自定義UIView的setFrame/setBounds方法更改所有子視圖的所有幀。我不喜歡這個解決方案,因爲iOS5和iOS6中的旋轉方法是不同的,我不想在每個UIViewController中都使用它自己的自定義UIView。
有什麼建議嗎?
我也遇到了這個問題。你有其他正確的解決方案嗎? – ShengHuaWu 2013-10-27 15:14:34
嗨盛華武,我現在做的是以下。我仍然創建一個不實現layoutsubviews的自定義子視圖。然後我在該視圖中使用自定義的setNewFrame方法,該方法是在加載視圖控制器和任何旋轉更改時設置的。在那個自定義的setNewFrame方法中,我爲那裏的所有子視圖設置了所有的框架。這種方式看起來不錯,在子視圖中的任何旋轉和動畫完美:) – 2013-10-27 17:04:49
感謝您的分享。 – ShengHuaWu 2013-11-12 14:25:46