2012-10-10 29 views
8

Theo doc chính thức về UIView về contentMode tài sản:Loại nội dung nào UIViewContentMode mode đề cập đến?

The content mode specifies how the cached bitmap of the view’s layer is adjusted when the view’s bounds change 

gì định nghĩa nội dung trong định nghĩa này? Đó có phải là chế độ xem phụ hay khi chúng tôi xác định màu nền cho chế độ xem chẳng hạn.

tôi đoán đầu tiên là nó nên áp dụng ít nhất là trong subviews trong một cái nhìn, nhưng ví dụ đoạn mã sau đây sẽ không cung cấp cho tôi những kết quả mong đợi khi chơi với UIViewContentModeCenter tag:

UIView* redView = [[UIView alloc] initWithFrame:CGRectMake(80, 80, 150, 200)]; 
redView.contentMode = UIViewContentModeCenter; 
redView.backgroundColor = [UIColor redColor]; 

UIView* greenView = [[UIView alloc] initWithFrame:redView.bounds]; 
greenView.backgroundColor = [UIColor greenColor]; 
[redView addSubview:greenView]; 

redView.frame = CGRectInset(redView.frame, -5, -5); 
[self.view addSubview:redView]; 

Tôi vừa thiết lập một redView sẽ bao gồm một greenView. Tôi cũng đã thiết lập chế độ nội dung của chế độ xem lại thành UIViewContentModeCenter - tại sao trong mã tôi viết greenView không được căn giữa khi tôi thay đổi khung của cha mẹ? không phải là những gì UIViewContentModeCenter là nghĩa vụ phải làm gì?

Cảm ơn bạn đã làm rõ!

Ps: Bạn có thể dễ dàng kiểm tra mã trên trong loadView của dự án mẫu bộ điều khiển chế độ xem đơn giản.

+0

Chắc chắn bằng cách điều chỉnh khung bạn sẽ được vẽ lại xem, trong đó có quan điểm phụ mà được thiết lập để giới hạn khung hình đang được thay đổi? Do đó nó sẽ không ở lại trung tâm như các giới hạn có liên quan đến khung? Bằng tiếng Anh đơn giản, sử dụng các giới hạn vì khung hình của bạn luôn là 0,0 và chiều rộng và chiều cao phù hợp –

Trả lời

10

Từ các tài liệu:

Phương thức nội dung quy định cụ thể như thế nào bitmap cache của của xem lớp được điều chỉnh khi của quan điểm giới hạn thay đổi.

Đối với chế độ xem hình ảnh, điều này đang nói về hình ảnh. Đối với chế độ xem vẽ nội dung của nó, điều này đang nói về nội dung được vẽ. Nó không không ảnh hưởng đến bố cục của các bản xem trước.

Bạn cần xem xét các mặt nạ tự động đặt tại vị trí trên các bản xem trước. Chế độ nội dung là một cá trích màu đỏ ở đây. Nếu bạn không thể đạt được bố cục , bạn cần sử dụng mặt nạ tự động hóa, sau đó bạn cần triển khai bố cục Subviews và tính toán vị trí và khung hình của tiểu sử theo cách thủ công.

từ câu trả lời jrturton để: https://stackoverflow.com/a/14111480/1374512

4

Đầu đọc về chế độ Contenthere

Trong ví dụ của bạn, bạn thay đổi khung về quan điểm đỏ. Điều đó sẽ gọi layoutSubviews trên khung nhìn sẽ định vị lại khung nhìn màu xanh lá cây theo các ràng buộc bố trí hoặc các mặt nạ tự động hóa. Bạn chưa chỉ định bất kỳ. Vì vậy, khung của khung cảnh xanh sẽ giữ nguyên.

Chế độ nội dung chỉ định cách lớp của chế độ xem sẽ cập nhật khi thay đổi kích thước. Tùy thuộc vào chế độ vẽ nội dung drawRect sẽ được gọi hay không.

Bạn có thể kiểm tra ảnh hưởng của các phương thức nội dung khác nhau với các ví dụ sau:

Thêm một phân lớp UIView, vẽ hình một vòng tròn sử dụng thực hiện drawRect này:

- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
    NSLog(@"drawRect %@", NSStringFromCGRect(rect)); 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextAddEllipseInRect(ctx, self.bounds); 
    [[UIColor redColor] setFill]; 
    CGContextFillPath(ctx); 
} 

Trong điều khiển xem tạo và thêm quan điểm vòng tròn:

CircleView* circleView = [[CircleView alloc] initWithFrame:CGRectMake(10, 10, 20, 20)]; 
circleView.contentMode = UIViewContentModeCenter; // <- try different modes here 
[self.view addSubview:circleView]; 

Bây giờ cho phép animate khung và xem những gì sẽ xảy ra:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [UIView animateWithDuration:5 animations:^{ 
     circleView.frame = CGRectMake(10, 10, 100, 200); 
    }]; 
}); 

Tôi đang làm điều đó một cách không đồng bộ để buộc CoreGraphics vẽ chế độ xem ít nhất một lần với khung gốc. Khi bạn không đặt chế độ nội dung, bạn kết thúc với một vòng tròn mờ, vì nó chỉ tăng lên mà không cần vẽ lại. UIViewContentModeCenter làm cho vòng tròn nhỏ ở trung tâm - cũng không cần vẽ lại. UIViewContentModeRedraw làm cho khung nhìn vẽ lại khung nhìn với khung mới. Trên thực tế điều đó xảy ra trước khi hoạt ảnh bắt đầu.

Lưu ý rằng chế độ nội dung có thể ảnh hưởng đến hiệu suất bản vẽ.

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