2015-12-16 48 views
9

Trong đơn đăng ký của tôi, tôi đang sử dụng ActiveLabel fram Github.Căn chỉnh theo chiều dọc UILabel

Trong trường hợp đó, nhãn của tôi không hiển thị văn bản ở giữa UILabel. Nếu tôi sử dụng một UILabel bình thường nó hoạt động tốt, nhưng khi cài đặt nó vào một ActiveLabel, nó sẽ như thế này. enter image description here

(Hình ảnh được thực hiện trong thời gian chạy)

Tôi nghĩ rằng đây là mã để chơi với sự liên kết bằng cách nào đó:

/// add line break mode 
private func addLineBreak(attrString: NSAttributedString) -> NSMutableAttributedString { 
    let mutAttrString = NSMutableAttributedString(attributedString: attrString) 

    var range = NSRange(location: 0, length: 0) 
    var attributes = mutAttrString.attributesAtIndex(0, effectiveRange: &range) 

    let paragraphStyle = attributes[NSParagraphStyleAttributeName] as? NSMutableParagraphStyle ?? NSMutableParagraphStyle() 
    paragraphStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping 
    if let lineSpacing = lineSpacing { 
     paragraphStyle.lineSpacing = CGFloat(lineSpacing) 
    } 

    attributes[NSParagraphStyleAttributeName] = paragraphStyle 
    mutAttrString.setAttributes(attributes, range: range) 

    return mutAttrString 
} 

ActiveLabel.swift

ActiveType.swift

Bất kỳ ý tưởng như thế nào tôi có thể làm cho nó ở giữa như thế này: enter image description here

(Hình ảnh được lấy từ Storyboard)

+0

Trong kịch bản thêm dọc và các ràng buộc ngang cho khung nhìn cha mẹ. Ngoài ra, hãy đảm bảo bạn đang thực hiện điều đó trong chế độ xem Bảng bất kỳ/Bất kỳ – Alex

+0

@Alex - Tôi không sử dụng Bố cục Tự động trong ứng dụng của mình. –

+1

Ah đủ công bằng, tôi có thể hỏi tại sao không? Nó giải quyết rất nhiều đau đầu thay vì tự tạo ra các ràng buộc – Alex

Trả lời

3

Trong ActiveLabel.swift thay thế các phương pháp drawTextInRect với

public override func drawTextInRect(rect: CGRect) { 
     let range = NSRange(location: 0, length: textStorage.length) 

     textContainer.size = rect.size 

     let usedRect = layoutManager.usedRectForTextContainer(textContainer) 

     let glyphOriginY = (rect.height > usedRect.height) ? rect.origin.y + (rect.height - usedRect.height)/2 : rect.origin.y 
     let glyphOrigin = CGPointMake(rect.origin.x, glyphOriginY) 

     layoutManager.drawBackgroundForGlyphRange(range, atPoint: glyphOrigin) 
     layoutManager.drawGlyphsForGlyphRange(range, atPoint: glyphOrigin) 
    } 

Tôi cũng đã chia hai repo dưới https://github.com/rishi420/ActiveLabel.swift

Nếu bạn tải về repo, hãy nhớ thiết lập verticalTextAlignmentCenter để true

+0

Omg bạn là một vị thần!:) Một vấn đề khác khi sử dụng ActiveLabel là kích thước phông chữ tối thiểu không hoạt động, kích thước phông chữ không thay đổi nếu có nhiều từ trong chuỗi. Bạn có thể sửa nó không? Tôi muốn rằng toàn bộ văn bản phù hợp trong UILabel (Active Label), và cũng thay đổi kích cỡ phông chữ để phù hợp trong UILabel. –

+0

EDIT: Tôi đã thử thêm 'minimumScaleFactor = 1' và' adjustsFontSizeToFitWidth = true' trên 'userInteractionEnabled = true' trong' private func setupLabel() 'nhưng điều đó không làm gì cả. –

+0

@RoduckNickes :) về câu hỏi thứ hai của bạn, repo được chia nhỏ được cập nhật. Tải xuống mẫu repo được chia nhỏ. sử dụng 'minFontSize'. Có rất nhiều chỗ để cải thiện trong kho. Bất kỳ cơ thể nào cũng cảm thấy tự do để đóng góp. –

0

Bạn có thể đặt textAlignment trong các mã như thế này: showLab.textAlignment = NSTextAlignmentCenter;

Hoặc bạn cũng có thể sử dụng Storyboard hoặc xib để xem những gì xảy ra trong phòng thí nghiệm, StoryBoard, như bạn nhìn tôi chọn thứ hai của sự liên kết những gì có nghĩa là giữa trong nhãn

0

Hãy nhìn vào bài đăng này:

Programmatically Add CenterX/CenterY Constraints

Vấn đề sẽ xảy ra khi bạn đã kéo nhãn từ IB và sau đó bạn đang cố thay đổi vị trí của nó. Mã sẽ phá vỡ. Bạn sẽ cần phải lập trình làm nhãn và sau đó đặt nó vào giữa.

Và rất nghiêm túc, @ Alex là chính xác. AutoLayout giải quyết rất nhiều vấn đề.

Các vấn đề liên quan