在iOS 8上,對於較大的設備,默認的tableView插入似乎會更改。如果您正在佈局自定義單元格並將它們的左側佈局約束與單元格的默認大小15插入匹配,那麼您的佈局在較小的設備上看起來會很好,但在插入更改的較大設備上,您會看到類似於以下內容的內容:iOS 8 UITableView嵌入:如果您有自定義佈局的單元格,您可能也會遇到此問題
我怎樣才能解決這個問題?
在iOS 8上,對於較大的設備,默認的tableView插入似乎會更改。如果您正在佈局自定義單元格並將它們的左側佈局約束與單元格的默認大小15插入匹配,那麼您的佈局在較小的設備上看起來會很好,但在插入更改的較大設備上,您會看到類似於以下內容的內容:iOS 8 UITableView嵌入:如果您有自定義佈局的單元格,您可能也會遇到此問題
我怎樣才能解決這個問題?
託管寫一些東西,似乎工作得很好。如果有更漂亮的解決方案,請分享。
@interface InsetRespectingTableViewCell()
@property (nonatomic) IBOutlet NSLayoutConstraint * leftContentInset;
@property (nonatomic) IBOutlet NSLayoutConstraint * rightContentInset;
@end
@implementation InsetRespectingTableViewCell
- (UITableView *)tableView {
UIView *view;
for (view = self.superview; ![view isKindOfClass:UITableView.class] && view; view = view.superview);
return (UITableView *)view;
}
- (void)updateInset {
CGFloat defaultInset = [self tableView].separatorInset.left;
self.leftContentInset.constant = defaultInset;
self.rightContentInset.constant = defaultInset;
}
- (void)didMoveToSuperview {
[super didMoveToSuperview];
[self updateInset];
}
有關正確的方法,請查看[這篇文章](http://stackoverflow.com/questions/27420888/uitableviewcell-with-autolayout-left-margin-different-on-iphone-and-ipad) – yilin 2016-01-23 19:49:25
Xcode6沒有選項/屬性來解決它。有一個setter方法setSepratorInset設置插入值。但我們無法將(-ve)值傳遞給<#CGFloat left#>
以從左側開始。作爲其最低值始終爲0
[tableView setSeparatorInset:UIEdgeInsetsMake(<#CGFloat top#T, <#CGFloat left#>, <#CGFloat bottom#>, <#CGFloat right#>)];
如果你想要得到它解決然後隱藏分隔線,並添加1px的一個ImageView的使用所需的寬度來創建行並將其添加到細胞,這將在每個設備上看起來都一樣。
不確定爲什麼這是如此投票....它不能解決問題。 – 2014-10-21 22:36:07
我能夠使用大小約束來匹配除iPhone 6+以外的所有東西的外觀,只要我堅持使用iOS 8。修復iOS 8上的外觀在iOS 7上破壞了它。我使用的基本方法是不同的設置約束「常寬|任何高度」和13個像素,而不是7 PX的使用插圖:
它不是一個完整的解決方案,但它是一個開始。
在您的自定義單元格中,您可以覆蓋layoutSubviews並指定所需的插圖。
「你應該重寫此方法僅在子視圖的自動尺寸和基於約束的行爲,不提供你想要的行爲」
這很有意思。
在由Xcode5創建的項目中,分隔符的左側插入內容爲15/15/16(iPhone5s/iPhone6/iPhone6P)。
而在由Xcode6創建的項目中是16/16/20(iPhone5s/iPhone6/iPhone6P)。
在我的情況下,我禁用了tableView中的默認分隔符,並且讓一個baseCell重繪了separatorLine。
鏈接:https://github.com/jshl8612/UTableViewBaseCell
希望它能有助於一點點。
注意 - 如果你需要添加一個真正的一個像素線,不具有圖像愚弄,使用此:
@interface UILine : UIView
@end
@implementation UILine
-(void)awakeFromNib
{
float sortaPixel = 1.0/[UIScreen mainScreen].scale;
// float sortaPixel = 1.0/self.contentScaleFactor;
// -- recall, that does NOT work when loading from storyboard!
UIView *line = [[UIView alloc] initWithFrame:
CGRectMake(0, 0, self.frame.size.width, sortaPixel)];
line.userInteractionEnabled = NO;
line.backgroundColor = self.backgroundColor;
line.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self addSubview:line];
self.backgroundColor = [UIColor clearColor];
self.userInteractionEnabled = NO;
}
@end
如何在故事板使用,只是做一個UIView是是在確切的地方,並確切的寬度,你想要的。 (自然地,使它伸展到寬度,或根據需要做任何事情。)
只要使視圖 - 比方說 - 5 pr 6像素高 - 純粹的,所以你可以正確地看到它。 (這不要緊,你有多高,使其在故事板)。
(您想單像素線做了UIView的頂部完全一樣。)
讓UIView的任何你想要的顏色,大概黑色。
將類更改爲UILine。在運行時,它將在所有設備的確切位置繪製完美的單像素線。
希望它能以小的方式幫助解決這個問題。
只是一個腳註 - 在現代IB中,您可能可以使用** @ IBDesignable **將其作爲自定義視圖顯示,更精美地顯示在故事板中。對於objC http://stackoverflow.com/a/24465867/294884 – Fattie 2014-10-27 10:11:07
這是想法如何解決。
@IBOutlet weak var leftViewLeadingConstraint: NSLayoutConstraint!
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
switch UIScreen.mainScreen().scale {
case 2:
leftViewLeadingConstraint.constant = 7.0
case 3:
leftViewLeadingConstraint.constant = 11.0
default:
assertionFailure("Error: wrong scale value")
}
}
當新的屏幕顯示出來並且您沒有更新您的代碼時,您想要終止該應用程序嗎?不知道這是一個聰明的想法......另外,接受的答案不依賴於自定義常量,這可能在未來的iOS版本中發生變化。 – 2015-03-12 21:43:36
我知道這不是一個完美的解決方案,但此時它適用於所有iPhone屏幕。當然,對於具有新比例因子的iPhone,應該更新應用程序。 – 2015-03-13 11:06:23
你能告訴我們一個問題的圖片嗎? – 2014-10-03 12:15:25
@MarcusAdams完成。 – 2014-10-03 22:35:47
你真的需要爲你的單元格做自定義佈局嗎?你的第一個單元格看起來像一個標準單元格,樣式爲「UITableViewCellStyleValue1」 – Clafou 2014-10-13 13:29:41