2013-07-11 93 views
1

我通過繼承UIPopoverBackgroundView來自定義彈出窗口的外觀。一切工作正常,除了有一些箭頭和內容視圖之間存在差距的情況。如果我繼續旋轉設備來解散popover,然後將其恢復,有時會排隊,而其他人則不會。我記錄框架尺寸,並且它們始終如一,所以我不知道發生了什麼。我附上截圖和我的layoutSubviews代碼如下。使用自定義iPad彈出窗口對齊內容視圖的箭頭

你在哪裏看到我在箭頭方向右減去4的情況下,這是基於試用&使它至少在某些時間工作的錯誤。我討厭這樣的編碼,因爲我不確定這個4點的空間是什麼,例如爲什麼我不需要它在箭頭方向的所有情況下。

在圖片中,第一張照片顯示了問題。這發生在隨機觸發popover上。下一張圖片顯示了它在隨後在應用程序的相同執行中被觸發時隨機工作。

另外值得一提的是,我在http://blog.teamtreehouse.com/customizing-the-design-of-uipopovercontroller找到了一些示例代碼,並且嘗試了這個版本的layoutSubviews,儘管它已經和我的非常相似了。即使有了這個代碼,我仍然看到了同樣的問題。

編輯:值得一提的可能是從我的截圖明顯的,但我不包括我酥料餅的邊框:

+ (UIEdgeInsets)contentViewInsets 
{ 
    return UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 0.0f); 
} 

可能也值得,我不使用的圖像文件爲我的箭頭圖像,而是提我正在繪製它自定義。再說一次,即使我評論出圖畫時仍然存在這個問題,所以我不認爲它是相關的,但是爲了充分披露,我想提及它。

任何幫助非常感謝。謝謝。

CGSize arrowSize = CGSizeMake(kCMAPopoverBackgroundViewArrowBase, kCMAPopoverBackgroundViewArrowHeight); 
// Leaving code out for drawArrowImage - even when I leave the arrowImageView as 
// an empty image view and set a non-clear background color this gap is still 
// sporadically showing up 
self.arrowImageView.image = [self drawArrowImage:arrowSize]; 

float arrowXCoordinate = 0.0f; 
float arrowYCoordinate = 0.0f; 
CGAffineTransform arrowRotation = CGAffineTransformIdentity; 

float borderMargin = 2.0f; 

switch (self.arrowDirection) { 
    case UIPopoverArrowDirectionUp: 
     arrowXCoordinate = ((self.bounds.size.width/2.0f) - (arrowSize.width/2.0f)); 
     arrowYCoordinate = 0.0f; 
     break; 

    case UIPopoverArrowDirectionDown: 
     arrowXCoordinate = ((self.bounds.size.width/2.0f) - (arrowSize.width/2.0f)); 
     arrowYCoordinate = self.bounds.size.height - arrowSize.height; 
     arrowRotation = CGAffineTransformMakeRotation(M_PI); 
     break; 

    case UIPopoverArrowDirectionLeft: 
     arrowXCoordinate = 0.0f - (arrowSize.height/2.0f) + borderMargin; 
     arrowYCoordinate = ((self.bounds.size.height/2.0f) - (arrowSize.height/2.0f)); 
     arrowRotation = CGAffineTransformMakeRotation(-M_PI_2); 
     break; 

    case UIPopoverArrowDirectionRight: 
     arrowXCoordinate = self.bounds.size.width - arrowSize.height - 4.0f; 
     arrowYCoordinate = ((self.bounds.size.height/2.0f) - (arrowSize.height/2.0f)); 
     arrowRotation = CGAffineTransformMakeRotation(M_PI_2); 
     break; 

    default: 
     break; 

} 

self.arrowImageView.frame = CGRectMake(arrowXCoordinate, arrowYCoordinate, arrowSize.width, arrowSize.height); 
[self.arrowImageView setTransform:arrowRotation]; 

Here is an example of the issue happening on a random occurrence

This is an example of it not happening on another random occurrence on the

回答

1

是您的箭頭影像坊?如果不是的話,我猜測這個轉換正在影響它的框架,這會產生意想不到的差距。

+0

不是。讓我記錄圖像視圖的框架,看看是否發生這種情況。不知道爲什麼它不是一貫地發生,如果這是這種情況,但好的想法。謝謝! – fogwolf

+0

沒問題,我想我記得遇到類似的東西,希望這有助於追蹤它。 –

+0

使圖像視圖框架正方形解決它,但然後箭頭偏斜。由於我不希望它是方形的,我可以在此視圖的寬度和高度上添加自動佈局約束嗎?我該怎麼做?我現在使用谷歌搜索,但到目前爲止還沒有找到它,只是用視覺格式設置約束的更復雜的例子。謝謝!雖然現在我想到了它,因爲它沒有歪斜,我不需要限制寬度和高度 - 如果我不想讓我的箭頭變成方形,該怎麼辦? – fogwolf

0

也許你在你的計算中獲得子像素值(最有可能0.5)

嘗試使用floorfceilf以確保您的值在像素積分值準確着陸。

例如...

arrowXCoordinate = floorf(((self.bounds.size.width/2.0f) - (arrowSize.width/2.0f))); 

floor參考。

+0

試過這個但仍然是同樣的問題。謝謝。 – fogwolf