Làm cách nào để tạo phần trăm tổng chiều rộng bằng tính năng tự động thanh toán?


114

Tôi cần tạo ba cột động, mỗi cột có một tỷ lệ phần trăm cố định của tổng chiều rộng. Không phải phần ba, mà là các giá trị khác nhau. Ví dụ, minh họa sau đây cho thấy ba cột: cột đầu tiên rộng 42%, cột thứ hai rộng 25% và cột thứ ba rộng 33%.

Đối với 600 pixel trên bộ điều khiển chế độ xem, tương ứng sẽ là 252, 150 và 198 pixel.

Tuy nhiên, đối với bất kỳ kích thước hiển thị nào tiếp theo (tức là iPhone 4 ngang (rộng 960) hoặc iPad 2 dọc (rộng 768), tôi muốn tỷ lệ phần trăm tương đối giống nhau (không phải chiều rộng pixel được trích dẫn ở trên).

Có cách nào để làm điều này bằng cách sử dụng Bảng phân cảnh (tức là không có mã) không? Tôi có thể thực hiện điều này dễ dàng bằng mã, nhưng mục tiêu của tôi là đưa càng nhiều logic hiển thị này vào Bảng phân cảnh càng tốt.

nhập mô tả hình ảnh ở đây

Câu trả lời:


205

Nếu, như bạn nói, bạn biết cách làm điều đó trong mã, thì bạn đã biết cách làm điều đó trong bảng phân cảnh. Đó chính xác là những ràng buộc giống nhau, nhưng bạn đang tạo chúng bằng hình ảnh chứ không phải bằng mã.

  1. Chọn cả chế độ xem và chế độ xem siêu cao của nó.

  2. Chọn Editor -> Pin -> Widths Equally để hạn chế chiều rộng bằng chiều rộng của superview (thực tế hộp thoại bật lên "ghim" ở cuối canvas hoạt động tốt nhất ở đây).

  3. Chỉnh sửa ràng buộc và đặt Hệ số nhân thành phân số mong muốn, ví dụ: 0,42. Và đối với các quan điểm khác cũng vậy.


9
Đảm bảo rằng chế độ xem bạn đang hạn chế xuất hiện trong "mục đầu tiên" của Ràng buộc Độ rộng Bằng nhau chứ không phải chiều rộng của chế độ xem siêu cao, nếu không, bạn đang tạo bội số chiều rộng chế độ xem phụ của chiều rộng chế độ xem cao. Khi điều khiển kéo từ chế độ xem phụ đến chế độ xem siêu lớn để áp dụng giới hạn chiều rộng bằng nhau, chúng luôn bị đảo ngược, điều này có vẻ phản trực quan đối với tôi.
memmons

Ah - bằng cách "làm điều đó trong mã", tôi muốn nói điều gì đó giống như "thủ công, không có ràng buộc hoặc tự động thanh toán".
Jeffrey Berthiaume

Câu trả lời rất hay. Tôi rất ngạc nhiên IB không cung cấp cách thực hiện việc này khi chỉnh sửa ràng buộc.
wcochran

Tôi đã cố gắng áp dụng điều này trong UITableViewCell của mình và mọi thứ đều chuyển sang màu xám. Tôi đã phải nhúng tất cả các dạng xem của mình vào dạng xem mới và chọn Chiều rộng Bằng nhau từ nhãn của mình cho dạng xem mới này. Hy vọng nó giúp.
nano

6
Tính năng mới trong Xcode7: Nếu bạn muốn căn chỉnh các chế độ xem đều nhau, hãy sử dụng "Chế độ xem ngăn xếp" mới.
Bijan

15

Khi Apple giới thiệu UIStackView , công việc đã trở nên dễ dàng hơn rất nhiều.

Phương pháp 1: Sử dụng Nib / StoryBoard:

Bạn chỉ cần thêm ba chế độ xem trong trình tạo giao diện và nhúng chúng vào chế độ xem ngăn xếp

Xcode ► Trình chỉnh sửa ► Nhúng vào ► StackView

nhập mô tả hình ảnh ở đây

Chọn stackView & đưa ra ràng buộc với chiều cao đầu, cuối, trên và bằng với safeArea

Nhấp vào khu vực kiểm tra thuộc tính & Đặt StackView theo chiều ngang & phân phối để lấp đầy theo tỷ lệ

[ nhập mô tả hình ảnh ở đây3

Đưa ra ràng buộc của ba chế độ xem với đầu, cuối, trên, dưới với các cạnh tương ứng. nhập mô tả hình ảnh ở đây

Phương pháp 2: Lập trình:

import UIKit
class StackViewProgramatically: UIViewController {
    var propotionalStackView: UIStackView!
    ///Initially defining three views
    let redView: UIView = {
        let view = UIView()//taking 42 % initially
        view.frame = CGRect(x: 0, y: 0, width: 42 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .red
        return view
    }()

    let greenView: UIView = {
        let view = UIView()//taking 42* initially
        view.frame = CGRect(x: 42 * UIScreen.main.bounds.width/100, y: 0, width: 25 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .green
        return view
    }()
    let blueView: UIView = {
        let view = UIView()//taking 33*initially
        view.frame = CGRect(x: 67 * UIScreen.main.bounds.width/100, y: 0, width: 33 * UIScreen.main.bounds.width/100, height: UIScreen.main.bounds.height)
        view.backgroundColor = .blue
        return view
    }()

    ///Changing UIView frame to supports landscape mode.
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        DispatchQueue.main.async {
            self.redView.frame = CGRect(x: 0, y: 0, width: 42 * self.widthPercent, height: self.screenHeight)
            self.greenView.frame = CGRect(x: 42 * self.widthPercent, y: 0, width: 25 * self.widthPercent, height: self.screenHeight)
            self.blueView.frame = CGRect(x: 67 * self.widthPercent, y: 0, width: 33 * self.widthPercent, height: self.screenHeight)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        //Adding subViews to the stackView
        propotionalStackView = UIStackView()
        propotionalStackView.addSubview(redView)
        propotionalStackView.addSubview(greenView)
        propotionalStackView.addSubview(blueView)
        propotionalStackView.spacing = 0
        ///setting up stackView
        propotionalStackView.axis = .horizontal
        propotionalStackView.distribution = .fillProportionally
        propotionalStackView.alignment = .fill
        view.addSubview(propotionalStackView)
    }
}
//MARK: UIscreen helper extension
extension NSObject {

    var widthPercent: CGFloat {
        return UIScreen.main.bounds.width/100
    }

    var screenHeight: CGFloat {
        return UIScreen.main.bounds.height
    }
}

Đầu ra:

Làm việc với phong cảnh và chân dung

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Demo dự án - https://github.com/janeshsutharios/UIStackView-with-constraints

https://developer.apple.com/videos/play/wwdc2015/218/


4

Tôi nghĩ điều này có thể được giải thích chi tiết hơn để nó có thể dễ dàng áp dụng hơn cho bất kỳ số lượng chế độ xem nào yêu cầu bố cục phần trăm cố định trong chế độ xem siêu lớn.

Chế độ xem ngoài cùng bên trái

  • Cố định vào SuperView.Leading
  • Xác định tỷ lệ phần trăm cố định của nó như một hệ số trên SuperView.Height

Chế độ xem trung gian

  • Xác định tỷ lệ phần trăm cố định của nó như một hệ số trên SuperView.Height
  • Ghim leftvào bên phải hàng xóm của nó

Chế độ xem bên phải

  • Không xác định tỷ lệ phần trăm cố định (nó là phần còn lại của chế độ xem có sẵn)
  • Ghim leftvào bên phải hàng xóm của nó
  • Ghim của nó rightvàoSuperView.Trailing

Tất cả các lượt xem

  • Xác định độ cao không cố định của chúng bằng cách neo vào Top Layout Guide.TopTop Layout Guide.bottom. Trong câu trả lời ở trên, lưu ý rằng điều này cũng có thể được thực hiện bằng cách đặt chiều cao bằng với chế độ xem lân cận.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.