質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

paragraphStyle.lineSpacingで縦スペースを入れたい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,282
退会済みユーザー

退会済みユーザー

Swift4
xcode9.2

FacebookライクなFeedをコードで作っています。

let paragraphStyle = NSMutableParagraphStyle()
         paragraphStyle.lineSpacing = 4


下記クラスFeedControllerで作成したcell内の、
ユーザーネームである"ゴールデン"と
日付け 所在地である"\nDecember 18 • san Francisco • "の間に
縦スペースを入れたいのですが、いくら4の数値を調整しても入りません。

\nをもう1つ増やしてみたりと試していますが、原因が分かりません。
ご存知の方がいらっしゃいましたら、教えていただきたいです。

// IPhone 6sでのサイズにしてます

import UIKit

let cellId = "cellId"
var layout = UICollectionViewFlowLayout()

class FeedController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    override func viewDidLoad() {
        super.viewDidLoad()

       //自分のナビバー タイトル
        navigationItem.title = "Facebook Feed"
       //垂直にバウンスする リロードの操作の動き
        collectionView?.alwaysBounceVertical = true

        collectionView?.backgroundColor = UIColor(white: 0.95, alpha: 1)

        collectionView?.register(FeedCell.self, forCellWithReuseIdentifier: cellId)

    }
    //コレクション セル 数
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection
        section: Int) -> Int {
        return 3
    }
    //2/6解決。エラー "method does not override from its superclass" 。書き込み直し予測変換のまま、打ち直すことで解決。
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        return collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath as IndexPath)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:
        UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       // 2/8 これはラッパー関数と呼ばれるもの?
        return CGSize(width: view.frame.width, height: 60)
    }

}


class FeedCell: UICollectionViewCell {

    override init(frame: CGRect) {
        super.init(frame: frame)

        setupViews()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    //セル ユーザーネームだよ
    let nameLabel: UILabel = {
        let label = UILabel()
        label.numberOfLines = 2

        let attributedText = NSMutableAttributedString(string: "ゴールデン", attributes:
            [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 14)])
        //日付け 文字の色
        attributedText.append(NSAttributedString(string: "\nDecember 18 • san Francisco • ",
            attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 12), NSAttributedStringKey.foregroundColor:
            UIColor(red: 155/255, green: 161/255, blue: 171/255, alpha: 1)]))


        //スペース パラグラフスタイル 1部misspellだと正しいspellの部分が干渉してエラーとなり、誤ったfixをしてしまう可能あり 注意する 現在はNSAttributedStringKeyという型
        let paragraphStyle = NSMutableParagraphStyle()
         paragraphStyle.lineSpacing = 4

        attributedText.addAttribute(NSAttributedStringKey.paragraphStyle, value: NSParagraphStyle(), range:
            NSMakeRange(0, attributedText.string.count))//string前のcharacters.を消した

        label.attributedText = attributedText

        return label
    }()

    //ユーザーのプロフ画像だよ
    let profileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "hgAiYyPhkHdBRKR1518078195_1518078228")
        imageView.contentMode = .scaleAspectFit
        return imageView
    }()

    //バックグラウンド 色とか?
    func setupViews() {
        backgroundColor = UIColor.white

        addSubview(nameLabel)
        addSubview(profileImageView)


        // 引数Format呼び出す?      Hです (44)は 横 サイズ。 これを縦横に設定してsquareにしてる
        addConstraintsWithFormat(format: "H:|-8-[v0(44)]-8-[v1]|", views: profileImageView, nameLabel)


        //60でnameLabelの位置を中央よりにしてる。まだ60で正確な中央に設定されてるかわからないから、設定できるようにする
        addConstraintsWithFormat(format: "V:|[v0(57)]", views: nameLabel)

        //-8-を減らせば上に 増やせば下にsquareの位置が変わる 8は中央
        addConstraintsWithFormat(format: "V:|-8-[v0(44)]", views: profileImageView)



    }

}

extension UIView {
    func addConstraintsWithFormat(format: String, views: UIView...) {
        var viewsDictionary = [String: UIView]()
        for (index, view) in views.enumerated() {
            let key = "v\(index)"
            viewsDictionary[key] = view
            view.translatesAutoresizingMaskIntoConstraints = false

        }

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(),
                                                  metrics: nil, views: viewsDictionary))
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

value: NSParagraphStyle()だと、自分が作ったparagraphStyleが適用されませんよ。

また、lineSpacingは行の下側の余白なので、z一行目(ゴールデン)のアトリビュートに設定すればいいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/09 15:19

    インスタンス化したlet paragraphStyleのparagraphStyleと同じvalue:にしないと適用されなかったということですか?
    fuzzball様の仰るこちらに変更し、問題なく縦スペースを確認できました。
    ゴールデンの位置も引き続き調整してみます。
    ありがとうございます!

    キャンセル

  • 2018/02/09 15:25

    >>同じvalue:にしないと適用されなかったということですか?
    意味が分かりません。
    value: paragraphStyle というのは「valueにparagraphStyleを渡す」という意味ですよ。

    キャンセル

  • 2018/02/09 15:45

    その部分が理解できてませんでした。
    勉強します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る