iOS 9
上のUITableViewCell
内のUITableView
s間のセパレーターに問題があります。かなりの左マージンがあります。 iOS 8
で導入された間隔を削除するコードは既にありますが、iOS 9
では機能しません。彼らは何か他のものを追加したようです。 layoutMarginsGuide で接続されていると思いますが、まだわかりません。誰かが同様の問題を抱えていて、解決策を見つけましたか?
さて、 解決策を見つけました 。そのために必要なことは、UITableView
の存在するインスタンスにフラグcellLayoutMarginsFollowReadableWidth
を設定することだけです。
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
私はドキュメントでいくつかの参照を見つけたいと思っていましたが、まだ準備ができていないようです 差分ページでのみ言及 。
フラグは後方互換性のためにiOS 9で導入されたため、設定する前にチェックを追加する必要があります。
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 2.0
の場合、#available
を使用してiOSバージョンを確認できます。
if #available(iOS 9, *) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
さらに、Xcode 7
以上でコンパイルする必要があります。
[〜#〜] edit [〜#〜]
セパレーターがiOS 8まで「細かく」見える場合、これが唯一の必要な修正であることに注意してください。そうでない場合は、もう少し変更する必要があります。 SOでこれを行う方法についての情報を見つけることができます。
Swift 2.2 iOS 9.3
ViewDidLoadで
tableView.cellLayoutMarginsFollowReadableWidth = false
UITableViewDelegatesで
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector(Selector("setSeparatorInset:")){
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
cell.preservesSuperviewLayoutMargins = false
}
if cell.respondsToSelector(Selector("setLayoutMargins:")){
cell.layoutMargins = UIEdgeInsetsZero
}
}
Swift 3.0/4.
tableView.cellLayoutMarginsFollowReadableWidth = false
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
if cell.responds(to: #selector(setter: UIView.layoutMargins)) {
cell.layoutMargins = UIEdgeInsets.zero
}
}
iOS 9までの完璧なソリューション
viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
//Required for iOS 9
if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) {
self.testTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
}
TableViewDelegateメソッドで次のコードを追加します:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
これはiOS 9で完璧に機能しました。
OBJ-Cの場合
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
{
[tableView setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)])
{
[cell setLayoutMargins:UIEdgeInsetsZero];
}
return cell;
}
受け入れられた答えは私にはうまくいきませんでした。 setCellLayoutMarginsFollowReadableWidth
をsetLayoutMargins
の前に移動するまで(iOS 8にはまだ必要):
if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
_tableView.cellLayoutMarginsFollowReadableWidth = NO;
}
if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
_tableView.layoutMargins = UIEdgeInsetsZero;
}
IOS 8および9の場合
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}
そして
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) [cell setLayoutMargins:UIEdgeInsetsZero];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
これは、XCode 8.2.1のSwift 3.0/iOS 10のソリューションです。
IBで動作し、プログラムでテーブルビューを作成するUITableviewのサブクラスを作成しました。
import UIKit
class EXCSuperTV: UITableView
{
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
setupView()
}
override init(frame: CGRect, style: UITableViewStyle)
{
super.init(frame: frame, style: style)
setupView()
}
func setupView() {}
}
class EXCNoFooter: EXCSuperTV
{
override func setupView()
{
super.setupView()
//tableFooterView = UIView.Zero()
}
}
class EXCMainTV: EXCNoFooter
{
override func setupView()
{
super.setupView()
separatorInset = UIEdgeInsets.zero
}
}